2009-05-08 37 views
6

tengo un control de usuario con ComboBox que en base a los datos XML:WPF: La unión a 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> 

Aquí es el control de usuario 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> 

En el MainForm.xaml Tengo un cuadro de texto que quiero vincular a mi UserControl SelectedItem.

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

Me alegrará si me guias cómo hacerlo.

¡Gracias de antemano!

Respuesta

12

El truco aquí es que cuando tiene que vincularse al elemento seleccionado en un control de elemento vinculado a XML, el elemento seleccionado en sí mismo es un elemento Xml, y debe usar XPath para llegar al elemento/atributo necesario.

La manera más sencilla de lograr esto es utilizar DataContext:

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

Hola saldoukhov! Gracias por la respuesta, pero, desafortunadamente, su solución no funciona :-(. Tal vez debido al enlace XML de ComboBox original encapsulado en UserControl? – user83493

+0

Funcionó para mí en Silverlight 5 sin tener que especificar 'XPath', simplemente al enlazar con el nombre de la propiedad del objeto retenido como, por ejemplo, 'Text = {Binding Description}'. – OmegaMan

1

La respuesta fue publicado anteriormente para el caso de un cuadro de lista se coloca directamente en el formulario. En el caso de UserControl y CompoBox con plantillas, evitaría el enlace xml puro; demasiados factores pueden romperlo. En su lugar, utilice este código para crear una propiedad de dependencia:

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

Y unión es simple entonces:

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

Por lo que vale la pena, he preferido enfoque anterior de Sergey mejor. Sin embargo, en mi caso, tuve una etiqueta en lugar de un cuadro de texto, pero esto funcionó para mí:

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

Spaciba, Sergey.