6 votes

WPF : Liaison à la ComboBox SelectedItem

J'ai un UserControl avec ComboBox qui se base sur des données XML :

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

Voici le XAML du 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 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>

Dans le fichier MainForm.xaml, j'ai une boîte de texte que je veux lier à la commande utilisateur SelectedItem.

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

Je serais heureux si vous me guidiez pour le faire.

Merci d'avance !

14voto

Sergey Aldoukhov Points 8386

Le problème est que lorsque vous devez vous lier à l'élément sélectionné d'un ItemControl lié à XML, l'élément sélectionné lui-même est un XmlElement et vous devez utiliser XPath pour atteindre l'élément/attribut nécessaire.

Le moyen le plus simple d'y parvenir est d'utiliser DataContext :

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

5voto

Bishop Points 61

Pour ce que ça vaut, je préférais l'approche précédente de Sergey. Cependant, dans mon scénario, j'avais une étiquette au lieu d'une zone de texte, mais cela a fonctionné pour moi :

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

Spaciba, Sergey.

1voto

Sergey Aldoukhov Points 8386

La réponse postée ci-dessus concernait le cas d'une boîte de liste placée directement sur le formulaire. Dans le cas d'un UserControl et d'une ComboBox modélisée, j'éviterais la liaison xml pure - trop de facteurs peuvent la casser. A la place, utilisez ce code pour créer une propriété de dépendance :

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

Et la fixation est alors simple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X