WPF组合框的值和显示文本

40

我习惯于像这样做事:

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

在ASP.NET中,State是一个列表框。

如何在WPF ComboBox中实现相同的功能?我看到ComboBoxItem对象中有一个叫做“Content”的属性,但我该如何为每个项目分配一个除用户显示内容以外的值?请帮忙。


1
你能否看一下我的答案,并判断它是否对未来的读者更有用,胜过你所接受的那个答案? - Alexander Abakumov
4个回答

77

WPF Combobox具有以下特点:

  • SelectedValuePath属性指定用于确定SelectedValue属性值的属性路径。它类似于ASP.NETListItemValue属性。
  • DisplayMemberPath属性定义默认模板,描述如何显示数据对象。它类似于ASP.NET ListItemText属性。

假设你想要你的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;
    }
}

那么,您的Combobox的XAML将如下所示:

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

Combobox中,您需要设置SelectedValuePathDisplayMemberPath属性,以显示对象的所需属性名称(分别对应KeyValue)。

或者,如果您真的想要在代码后台中添加项目到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
我认为这应该成为所选答案,因为它更详细地解释了可以做什么。 - Finlay Roelofs
1
很遗憾,回答发布后OP没有访问过SO,仍在等待他的回复。 - Alexander Abakumov

58

如果你只想在视图模型中公开一个简单的属性并处理视图中选择项的文本,你可以使用以下简单的解决方案:

    <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>

具有布尔属性的示例:

    <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>

布尔属性的示例:

<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"

2
很好的布尔值示例,正是我所需要的。我也不喜欢将所有可用的UI字符串(供选择)放在我的视图模型中,我只想在XAML中使用它们。 - Fredrik
1
为什么不使用Tag="True"? - dovid
3
@dovid,谢谢你的建议,我测试过了,它可行。我已经用简化的例子更新了我的答案,但也保留了旧的例子,以防需要处理一些特殊情况。 - TGasdf
1
要获取所选标签的值,请使用以下代码: string selectedTag = ((ComboBoxItem)this.ComboBoxName.SelectedItem).Tag.ToString(); 参见 https://dev59.com/Rm015IYBdhLWcg3w7wQW - intotecho

28

25
请举一个例子。 - Demodave

0
如果您跳过了“Value”,那么我认为在运行时向ComboBox添加新项就非常简单了。
comboBox1.Items.Add("SomeText");

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

SelectedIndex属性设置为Items.Count-1,以便新添加的项目显示为ComboBox中的选定项目。


OP想知道如何为组合框/下拉框中显示的每个项目分配一个值。这个回答是在谈论如何在运行时添加新项目,而不考虑值,完全偏离了问题的要点。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接