【问题标题】:WPF combobox value and display textWPF 组合框值和显示文本
【发布时间】:2010-09-23 04:46:04
【问题描述】:

我习惯做这样的事情

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

State 是 ASP.NET 中的列表框。

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

【问题讨论】:

  • 你能看看我的answer,看看它对未来的读者是否比你接受的更有用吗?

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


【解决方案1】:

WPF Combobox 有:

  • SelectedValuePath 属性,指定路径 用于确定SelectedValue 值的属性 财产。它类似于 ASP.NET ListItemValue 属性。
  • 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" />

您将SelectedValuePathDisplayMemberPath 属性设置为Combobox 显示的对象(对应的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"));
    }

【讨论】:

  • 我认为这应该是选择的答案,因为它更多地解释了可以做什么。
  • 很遗憾,贴完答案后OP还没有来过SO,还在等他。
【解决方案2】:

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

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

【讨论】:

  • 布尔值的好例子。正是我需要的。我也不喜欢将所有可用的 UI 字符串(从中选择)放在我的视图模型中,我只希望它们在 XAML 中。
  • 为什么不 Tag="True"?
  • @dovid 感谢您的建议,我进行了测试并且可以正常工作。我已经用简化的例子更新了我的答案,但也保留了旧的例子,以防极端情况需要。
  • 获取选中标签的值使用:string selectedTag=((ComboBoxItem)this.ComboBoxName.SelectedItem).Tag.ToString();见stackoverflow.com/questions/6309495
【解决方案3】:

查看组合的这些属性:

【讨论】:

  • 请举个例子。
【解决方案4】:

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

comboBox1.Items.Add("SomeText");

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多