WPF: binding to ComboBox SelectedItem

I have a UserControl with a ComboBox based on XML data:

<Root> <Node Background="Yellow" Foreground="Cyan" Image="1.ico" Property="aaaa" Value="28" /> <Node Background="SlateBlue" Foreground="Black" Image="2.ico" Property="bbbb" Value="2.5" /> <Node Background="Teal" Foreground="Green" Image="3.ico" Property="cccc" Value="4.0" /> <Node Background="Yellow" Foreground="Red" Image="4.ico" Property="dddd" Value="0" /></Root> 

Here is the UserControl XAML element:

 <UserControl x:Class="xxxxxxxx.MyComboBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="myComboBoxControl"> <UserControl.Resources> <DataTemplate x:Key="dataTemplateNode"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" MinWidth="20"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto" MinWidth="20"/> </Grid.ColumnDefinitions> <Border Background="{Binding XPath=@Background }" Grid.Column="0"> <Image Source="{Binding XPath=@Image }" Width="16" Height="16" Margin="3" /> </Border> <Border Background="{Binding XPath=@Background }" Grid.Column="1"> <TextBlock Foreground="{Binding XPath=@Foreground }" Margin="3" Text="{Binding XPath=@Property }" /> </Border> <Border Background="{Binding XPath=@Background }" Grid.Column="2"> <TextBlock Foreground="{Binding XPath=@Foreground }" Margin="3" FontWeight="Bold" Text="{Binding XPath=@Value }" /> </Border> </Grid> </DataTemplate> <XmlDataProvider x:Key="xmlNodeList" Source="/data/Combo.xml" XPath="/Root/Node"/> </UserControl.Resources> <ComboBox Name="myComboBox" ItemsSource="{Binding Source={StaticResource xmlNodeList}}" ItemTemplate="{StaticResource dataTemplateNode}" HorizontalContentAlignment="Stretch" /></UserControl> 

In MainForm.xaml, I have a TextBox that I want to bind to the UserControl SelectedItem.

 <StackPanel Orientation="Horizontal"> <local:MyComboBox1 x:Name="comboBoxST" /> <TextBox x:Name="textBoxST"/></StackPanel> 

I will be glad if you advise me how to do this.

Thanks in advance!

+6
wpf binding combobox
source share
3 answers

The trick here is that when you have to bind to the SelectedItem of an XML-related ItemControl, the selected item itself is an XmlElement, and you need to use XPath to get the item / attribute you need.

The easiest way to achieve this is to use a DataContext:

 <TextBox x:Name=textBoxST DataContext="{Binding ElementName=comboBoxST, Path=SelectedItem}" Text="{Binding XPath=@Value }"/> 
+12
source share

For what it's worth, I preferred Sergei an earlier approach better. However, in my script, I had a label instead of a text field, but this worked for me:

  <Label x:Name="labelST" Content="{Binding ElementName=comboBoxST, Path=SelectedValue}"/> 

Thank you, Sergey.

+2
source share

The answer above was for the case of a list placed directly on the form. In the case of UserControl and templated ComboBox, I would avoid the pure xml binding - too many factors can break it. Instead, use this code to create a dependency property:

  public MyComboBox() { InitializeComponent(); myComboBox.SelectionChanged += MyComboBoxSelectionChanged; } void MyComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { SetValue(SelValueProperty, ((XmlElement)e.AddedItems[0]).Attributes["Value"].Value); } public static readonly DependencyProperty SelValueProperty = DependencyProperty.Register("SelValue", typeof(string), typeof(MyComboBox), new FrameworkPropertyMetadata("")); 

And the binding is simple then:

 <TextBox x:Name=textBoxST Text="{Binding ElementName=comboBoxST, Path=SelValue}"/> 
+1
source share

All Articles