Подтвердить что ты не робот

Значение поля со списком WPF и отображаемый текст

Я привык делать что-то вроде

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

Где State - это Listbox в ASP.NET.

Как мне достичь того же с помощью WPF ComboBox? Я вижу свойство "Контент" в объекте ComboBoxItem, но как назначить каждому элементу значение, отличное от отображаемого пользователю? Пожалуйста, помогите.

4b9b3361

Ответ 2

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

Ответ 3

Если вы хотите показать простое свойство в 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"

Ответ 4

Если вы пропустите значение, я думаю, что довольно просто добавить новый элемент в ComboBox во время выполнения.

comboBox1.Items.Add("SomeText");

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

Свойству SelectedIndex установлено значение Items.Count-1, так что вновь добавленный элемент отображается в ComboBox как выбранный элемент.