web-dev-qa-db-fra.com

Valeur combobox WPF et affichage du texte

J'ai l'habitude de faire des choses comme

State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });

Où State est une zone de liste dans ASP.NET.

Comment est-ce que j'obtiens la même chose avec un WPF ComboBox? Je vois une propriété appelée "Contenu" dans l'objet ComboBoxItem mais comment puis-je attribuer à chaque élément une valeur autre que celle affichée à l'utilisateur? Veuillez aider.

21
Prabath Yapa

Voir ces propriétés de combo:

21
TalentTuner

WPF Combobox a:

  • SelectedValuePath propriété qui spécifie le chemin d'accès à la propriété utilisée pour déterminer la valeur de la propriété SelectedValue. Elle est similaire à la propriété ListItem d'ASP.NET Value.
  • DisplayMemberPath propriété qui définit un modèle par défaut qui décrit comment afficher les objets de données. Elle est similaire à la propriété ListItem d'ASP.NET Text.

Supposons que vous souhaitez que votre Combobox affiche une collection des objets KeyValuePair suivants:

private static readonly KeyValuePair<int, string>[] tripLengthList = {
    new KeyValuePair<int, string>(0, "0"),
    new KeyValuePair<int, string>(30, "30"), 
    new KeyValuePair<int, string>(50, "50"), 
    new KeyValuePair<int, string>(100, "100"), 
};

Vous définissez une propriété dans votre modèle de vue renvoyant cette collection:

public KeyValuePair<int, string>[] TripLengthList
{
    get
    {
        return tripLengthList;
    }
}

Ensuite, votre XAML pour le Combobox serait:

<ComboBox
    SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}"
    ItemsSource="{Binding TripLengthList, Mode=OneTime}"
    SelectedValuePath="Key"
    DisplayMemberPath="Value" />

Où vous définissez les propriétés SelectedValuePath et DisplayMemberPath sur les noms de propriétés souhaités des objets (Key et Value en conséquence) affichés par Combobox .

Ou, si vous voulez vraiment ajouter des éléments à Combobox dans le code derrière au lieu d'utiliser une liaison, vous pouvez également le faire. Par exemple:

<!--XAML-->
<ComboBox x:Name="ComboBoxFrom"
    SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" />

// Code behind
public partial class FilterView : UserControl
{
    public FilterView()
    {
        this.InitializeComponent();

        this.ComboBoxFrom.SelectedValuePath = "Key";
        this.ComboBoxFrom.DisplayMemberPath = "Value";
        this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(0, "0"));
        this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(30, "30"));
        this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(50, "50"));
        this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(100, "100"));
    }
33
Alexander Abakumov

Si vous souhaitez uniquement exposer une propriété simple dans le modèle de vue et gérer le texte des choix dans la vue, vous pouvez faire une solution simple comme celle-ci:

    <ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}">
        <ComboBoxItem Content="First choice" Tag="0"/>
        <ComboBoxItem Content="Second choice" Tag="1"/>
        <ComboBoxItem Content="Third choice" Tag="2"/>
    </ComboBox>

Exemple avec une propriété bool:

    <ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}">
        <ComboBoxItem Content="No" Tag="False"/>
        <ComboBoxItem Content="Yes" Tag="True"/>
    </ComboBox>

Alternatives de type verbeux (exemples originaux)

Vous trouverez ci-dessous des alternatives plus verbeuses où les types sont explicitement déclarés. Selon votre style préféré (ou peut-être certains types qui l'exigent), il vous convient peut-être mieux.

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}">
    <ComboBoxItem Content="First choice">
        <ComboBoxItem.Tag>
            <sys:Int32>0</sys:Int32>
        </ComboBoxItem.Tag>
    </ComboBoxItem>
    <ComboBoxItem Content="Second choice">
        <ComboBoxItem.Tag>
            <sys:Int32>1</sys:Int32>
        </ComboBoxItem.Tag>
    </ComboBoxItem>
    <ComboBoxItem Content="Third choice">
        <ComboBoxItem.Tag>
            <sys:Int32>2</sys:Int32>
        </ComboBoxItem.Tag>
    </ComboBoxItem>
</ComboBox>

Exemple avec une propriété bool:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}">
    <ComboBoxItem Content="No">
        <ComboBoxItem.Tag>
            <sys:Boolean>False</sys:Boolean>
        </ComboBoxItem.Tag>
    </ComboBoxItem>
    <ComboBoxItem Content="Yes">
        <ComboBoxItem.Tag>
            <sys:Boolean>True</sys:Boolean>
        </ComboBoxItem.Tag>
    </ComboBoxItem>
</ComboBox>

L'espace de noms sys est déclaré comme suit:

xmlns:sys="clr-namespace:System;Assembly=mscorlib"
27
TGasdf

Si vous sautez la valeur, je pense qu'il est assez simple d'ajouter un nouvel élément dans un ComboBox pendant l'exécution.

comboBox1.Items.Add("SomeText");

comboBox1.SelectedIndex = comboBox1.Items.Count - 1;

La propriété SelectedIndex est définie sur Items.Count-1 pour que le nouvel élément ajouté apparaisse dans la zone de liste déroulante en tant qu'élément sélectionné.

1
Mamta D