Ответ 1
См. эти свойства комбо:
Я привык делать что-то вроде
State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });
Где State - это Listbox в ASP.NET.
Как мне достичь того же с помощью WPF ComboBox? Я вижу свойство "Контент" в объекте ComboBoxItem, но как назначить каждому элементу значение, отличное от отображаемого пользователю? Пожалуйста, помогите.
См. эти свойства комбо:
WPF Combobox имеет:
SelectedValuePath
свойство, которое указывает путь к
свойство, которое используется для определения значения SelectedValue
имущество. Он похож на свойство ASP.NET ListItem
Value
.DisplayMemberPath
свойство, которое определяет шаблон по умолчанию
который описывает, как отображать объекты данных. Он похож на свойство ASP.NET ListItem
Text
.Скажем, вы хотите, чтобы ваш Combobox
отображал коллекцию следующих объектов KeyValuePair
:
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"),
};
Вы определяете свойство в своей модели представления, возвращающее эту коллекцию:
public KeyValuePair<int, string>[] TripLengthList
{
get
{
return tripLengthList;
}
}
Тогда ваш XAML для Combobox
будет:
<ComboBox
SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}"
ItemsSource="{Binding TripLengthList, Mode=OneTime}"
SelectedValuePath="Key"
DisplayMemberPath="Value" />
Если вы задали свойства SelectedValuePath
и DisplayMemberPath
для желаемых имен свойств объектов (Key
и Value
соответственно), отображаемых с помощью Combobox
.
Или, если вы действительно хотите добавить элементы в Combobox
в код за вместо использования привязки, вы также можете это сделать. Например:
<!--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"));
}
Если вы хотите показать простое свойство в viewmodel и обработать текст для выбора в представлении, вы можете сделать такое простое решение:
<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>
Пример с свойством bool:
<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}">
<ComboBoxItem Content="No" Tag="False"/>
<ComboBoxItem Content="Yes" Tag="True"/>
</ComboBox>
Альтернативы типа (оригинальные примеры)
Ниже приведены более подробные альтернативы, в которых типы явно объявлены. В зависимости от вашего предпочтительного стиля (или, возможно, некоторых типов, которые его требуют), возможно, вам это подходит лучше.
<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>
Пример с свойством 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>
Пространство имен sys объявляется следующим образом:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Если вы пропустите значение, я думаю, что довольно просто добавить новый элемент в ComboBox во время выполнения.
comboBox1.Items.Add("SomeText");
comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
Свойству SelectedIndex
установлено значение Items.Count-1
, так что вновь добавленный элемент отображается в ComboBox как выбранный элемент.