Значение комбинированного списка WPF и отображаемый текст - PullRequest
20 голосов
/ 23 сентября 2010

Я привык делать такие вещи, как

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

Где State - это список в ASP.NET.

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

Ответы [ 4 ]

29 голосов
/ 08 января 2016

WPF Combobox имеет:

  • SelectedValuePath свойство, которое указывает путь к свойству, которое используется для определения значения SelectedValue имущество.Это похоже на свойство Value ASP.NET ListItem.
  • DisplayMemberPath свойство, которое определяет шаблон по умолчанию, который описывает, как отображать объекты данных.Оно похоже на свойство Text ASP.NET ListItem.

Допустим, вы хотите, чтобы ваш 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"));
    }
24 голосов
/ 30 сентября 2016

Если вы хотите только показать простое свойство в модели представления и обработать текст для вариантов выбора в представлении, вы можете сделать простое решение, подобное этому:

    <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"
21 голосов
/ 23 сентября 2010

См. Эти свойства комбо:

1 голос
/ 23 сентября 2010

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

comboBox1.Items.Add("SomeText");

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...