I have a UserControl with ComboBox that 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:
<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 the MainForm.xaml I have a TextBox that I want to bind to the my UserControl SelectedItem.
<StackPanel Orientation="Horizontal">
<local:MyComboBox1 x:Name="comboBoxST" />
<TextBox x:Name="textBoxST"/></StackPanel>
I will glad if you will guid me how to do that.
Thanks in advance!
The trick here is that when you have to bind to the SelectedItem on an ItemControl bound to XML, the selected item itself is an XmlElement, and you have to use XPath to get to the needed element/attribute.
The easiest way to achieve this is to use DataContext:
<TextBox x:Name=textBoxST
DataContext="{Binding ElementName=comboBoxST, Path=SelectedItem}"
Text="{Binding XPath=@Value}"/>
For what it's worth, I preferred Sergey's earlier approach better. However, in my scenario, I had a label instead of a textbox but this worked for me:
<Label x:Name="labelST" Content="{Binding ElementName=comboBoxST, Path=SelectedValue}"/>
Spaciba, Sergey.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With