WPF组合框值和显示文本

时间:2010-09-23 04:46:05

标签: c# .net wpf visual-studio-2010

我习惯做像

这样的事情
State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });

State是ASP.NET中的列表框。

如何使用WPF ComboBox实现相同功能?我确实在ComboBoxItem对象中看到了一个名为“Content”的属性,但是如何为每个项目分配一个值而不是显示给用户的值?请帮忙。

4 个答案:

答案 0 :(得分:27)

WPF Combobox有:

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

我们假设您希望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"), }; 的XAML将是:

public KeyValuePair<int, string>[] TripLengthList
{
    get
    {
        return tripLengthList;
    }
}

Combobox<ComboBox SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" ItemsSource="{Binding TripLengthList, Mode=OneTime}" SelectedValuePath="Key" DisplayMemberPath="Value" /> 属性设置为SelectedValuePath显示的对象(DisplayMemberPathKey的相应属性名称)的位置。< / p>

或者,如果您真的想在后面的代码中添加项目Value而不是使用绑定,那么您也可以这样做。例如:

Combobox

答案 1 :(得分:23)

如果您只想在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"

答案 2 :(得分:19)

请参阅combo的这些属性:

答案 3 :(得分:1)

如果跳过Value,那么我认为在运行时将新项添加到ComboBox中非常简单。

comboBox1.Items.Add("SomeText");

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

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