3 Stimmen

Wert des TextBlocks im ComboBox DataTemplate ermitteln

Ich habe die folgende XAML:

<ComboBox Height="23" HorizontalAlignment="Left" Grid.Row="6" Grid.Column="2"
          Name="cbo_team" VerticalAlignment="Top" Width="148"
          DataContext="{Binding ElementName=cbo_component, Path=SelectedItem}"
          SelectedIndex="0">
    <ComboBox.ItemsSource>
        <Binding XPath="Teams/Team/@id"
                 Converter="{StaticResource xmlConverter}">
            <Binding.ConverterParameter>
                <local:XmlConverterParameter
                    XPathTemplate="/Products/Teams/Team[{0}]"
                    XPathCondition="@id='{0}'" />
            </Binding.ConverterParameter>
        </Binding>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding XPath=@name}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

In C# versuche ich, den Wert des Parameters TextBlock die sich im aktuell ausgewählten Element in der ComboBox . Wie kann ich das tun? Diese Frage ist so ziemlich das Gleiche, aber die einzige Antwort ist nicht hilfreich.

0voto

Sehen Sie sich dieses Beispiel an. Der Textblock (unterhalb der Combobox) zeigt den Wert des name-Attributs des aktuell ausgewählten xml-Elements in der Combobox an. Es erscheint ein Meldungsfenster mit demselben Ergebnis wie bei der Suche im visuellen Baum. Die Suche schlägt fehl, wenn die ursprüngliche Auswahl geändert wird. Es sieht so aus, als ob Comboboxitems erstellt werden, nachdem das ausgewählte Element festgelegt wurde.

XAML:

<Window x:Class="CBTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">

    <Window.Resources>
        <XmlDataProvider x:Key="UsersData" XPath="Users">
            <x:XData>
                <Users xmlns="">
                    <User name="Sally" />
                    <User name="Lucy" />
                    <User name="Linus" />
                    <User name="Charlie" />
                </Users>
            </x:XData>
        </XmlDataProvider>
    </Window.Resources>

    <StackPanel>

        <ComboBox 
            Name="_comboBox"
            ItemsSource="{Binding Source={StaticResource UsersData},XPath=*}"
            SelectedIndex="0"
            SelectionChanged="OnComboBoxSelectionChanged">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding XPath=@name}" Name="nameTextBlock" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

        <!-- Below shows how to get the value of selected item directly from the data. -->
        <TextBlock 
            DataContext="{Binding Path=SelectedItem, ElementName=_comboBox}"
            Text="{Binding XPath=@name}" />

    </StackPanel>

</Window>

Code dahinter, der zeigt, wie man den Text direkt durch Durchlaufen des visuellen Baums erhält:

private void OnComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox comboBox = sender as ComboBox;
    ComboBoxItem comboBoxItem = comboBox.ItemContainerGenerator.ContainerFromItem(comboBox.SelectedItem) as ComboBoxItem;
    if (comboBoxItem == null)
    {
        return;
    }
    TextBlock textBlock = FindVisualChildByName<TextBlock>(comboBoxItem, "nameTextBlock");
    MessageBox.Show(textBlock.Text);
}

private static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        string controlName = child.GetValue(NameProperty) as string;
        if (controlName == name)
        {
            return child as T;
        }
        T result = FindVisualChildByName<T>(child, name);
        if (result != null)
            return result;
    }
    return null;
}

0voto

Anand Shah Punkte 13989

Sorry ein wenig zu spät zur Party :) aber das folgende funktioniert auch (ironischerweise war ich in der gleichen Situation wie Sie!!)

TextBlock tb1 = (TextBlock)cbo_team.SelectedItem;
MessageBox.Show(tb1.Text);

0voto

TeJ Punkte 450
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox ContactListBox = sender as ListBox;
    ListBoxItem listBoxItem = ContactListBox .ItemContainerGenerator.ContainerFromItem(ContactListBox.SelectedItem) as ListBoxItem;
    if (listBoxItem == null)
    {
        return;
    }
    TextBlock txtBlock = FindVisualChildByName<TextBlock>(listBoxItem, "ListTextBlock");
   MessageBox.Show(txtBlock.Text);                        
}

private static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        string controlName = child.GetValue(NameProperty) as string;
        if (controlName == name)
        {
            return child as T;
        }
        T result = FindVisualChildByName<T>(child, name);
        if (result != null)
            return result;
    }
    return null;
}

0voto

WPMed Punkte 1414

Andere haben bereits vorgeschlagen, ein SelectionChanged-Ereignis zu verwenden. Ich habe den unten stehenden Code nicht getestet, aber Sie können ihn ausprobieren.

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    TextBlock tvContent = (sender as ComboBox).SelectedItem as TextBlock;

    string content = tvContent.Text;
}

0voto

kia nasirzadeh Punkte 2328
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var comboBox = (ComboBox)sender;
    ComboBoxItem comboAsTextblock = (ComboBoxItem)comboBox.SelectedItem;
    string comboBoxItemText = comboAsTextblock.Content.ToString();
    // comboBoxItemText is what you want :)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X