2009-05-08 15 views
6

Mam UserControl z ComboBox, że na podstawie danych XML:WPF: Binding do 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> 

Oto XAML UserControl:

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

W MainForm.xaml Mam TextBox które chcę powiązać z moim UserControl SelectedItem.

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

Będę zadowolony, jeśli mnie poprowadzisz, jak to zrobić.

Z góry dziękuję!

Odpowiedz

12

Podejście polega na tym, że kiedy musisz powiązać SelectedItem z ItemControl powiązanym z XML, sam wybrany element to XmlElement, a do uzyskania potrzebnego elementu/atrybutu musisz użyć XPath.

Najprostszym sposobem osiągnięcia tego celu jest użycie DataContext:

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

Witaj saldoukhov! Dziękuję za odpowiedź, ale, niestety, twoje rozwiązanie nie działa :-(Może to ze względu na powiązanie oryginalnego ComboBox w UserControl? – user83493

+0

Pracowałem dla mnie w Silverlight 5 bez konieczności określania 'XPath', po prostu przez powiązanie z nazwą właściwości docelowego obiektu, takiego jak 'Text = {Binding Description}'. – OmegaMan

1

Odpowiedź pisał wyżej dla przypadku listy umieszczonej bezpośrednio na formularzu. W przypadku UserControl i szablonowego ComboBox uniknęłoby to czystego wiązania xml - zbyt wiele czynników może go złamać. Zamiast tego należy użyć tego kodu, aby utworzyć właściwość Zależność:

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

i wiążąca jest prosta następnie:

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

Na co warto, wolałem wcześniej podejście Sergey za lepsze. Jednak w moim scenariuszu, miałem etykietę zamiast tekstowego, ale ten pracował dla mnie:

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

Spaciba Siergiej.

Powiązane problemy