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.
Voir ces propriétés de combo:
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"));
}
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"
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é.