2009-05-08 7 views
6

У меня есть UserControl с ComboBox, что на основе данных XML:WPF: Привязка к ComboBox SelectedItem

<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> 

Вот является 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 [email protected]}" Grid.Column="0"> 
       <Image Source="{Binding [email protected]}" 
         Width="16" 
         Height="16" 
         Margin="3" /> 
      </Border> 
      <Border Background="{Binding [email protected]}" Grid.Column="1"> 
       <TextBlock Foreground="{Binding [email protected]}" 
          Margin="3" 
          Text="{Binding [email protected]}" /> 
      </Border> 
      <Border Background="{Binding [email protected]}" Grid.Column="2"> 
       <TextBlock Foreground="{Binding [email protected]}" 
          Margin="3" 
          FontWeight="Bold" 
          Text="{Binding [email protected]}" /> 
      </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> 

В MainForm.xaml У меня есть TextBox что я хочу привязать к элементу UserControl SelectedItem.

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

Я буду рад, если вы посоветуете мне, как это сделать.

Заранее благодарен!

ответ

12

Фокус в том, что когда вы должны привязываться к элементу SelectedItem элемента ItemControl, связанного с XML, выбранный элемент сам по себе является XmlElement, и вы должны использовать XPath для получения необходимого элемента/атрибута.

Самый простой способ для достижения этой цели является использование DataContext:

<TextBox x:Name=textBoxST 
    DataContext="{Binding ElementName=comboBoxST, Path=SelectedItem}" 
    Text="{Binding [email protected]}"/> 
+0

Hello saldoukhov! Благодарим за отзыв, но, к сожалению, ваше решение не работает :-(Возможно, из-за привязки XML исходного ComboBox, инкапсулированного в UserControl? – user83493

+0

Работала для меня в Silverlight 5 без указания 'XPath', просто привязывая к имени свойства целевого объекта, такого как «Text = {Binding Description}». – OmegaMan

1

Ответ размещен выше был для случая окна списка помещенной непосредственно на форме. В случае UserControl и templated ComboBox я бы избегал чистой привязки xml - слишком много факторов могут ее нарушить. Вместо этого, используйте этот код, чтобы создать свойство зависимостей:

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("")); 

И связывание просто тогда:

<TextBox x:Name=textBoxST Text="{Binding ElementName=comboBoxST, Path=SelValue}"/> 
2

Для чего это стоит, я предпочел ранее подход Сергея лучше. Тем не менее, в моем случае, я имел метку вместо текстового поля, но это работает для меня:

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

Spaciba, Сергей.

Смежные вопросы