【问题标题】:How to make wpf combo box pull a special property如何使 wpf 组合框拉出一个特殊的属性
【发布时间】:2019-04-17 23:16:20
【问题描述】:

我想使用组合框输入纯整数值。

在我的应用中,有些数值有特殊的含义,但是任何数值都必须能够输入(输入)。

因此,组合框必须显示一个右侧带有下拉箭头的编辑字段。

如果单击下拉箭头,下拉列表必须为那些具有特殊含义的特殊数值(例如"103 - Wait for next turn")显示解释(字符串)列表。

如果用户点击下拉列表中的条目(而不是直接输入相应的值),则必须将相应的数值转移到编辑字段。

我尝试了以下方法:

  • 我将 ComboBox 的 IsEditable 属性设置为 true
  • 我将ItemsSource 属性绑定到具有数字属性(名为"Value")和字符串属性(名为"Explanation")的对象集合。
  • 我将DisplayMemberPath属性设置为"Explanation"(上面字符串属性的名称)

有了它,我可以随意输入任何我喜欢的数字,并且每个特殊数字的字符串解释都正确显示在下拉列表中。这正是我想要的。

但是,当我从下拉列表中选择一种解释时,解释字符串会被传送到编辑字段,不是对应的数值.

问题:如何让组合框在单击下拉列表中的项目时传输数字属性("Value")而不是说明文本?

【问题讨论】:

  • 好的,以下内容有点骇人听闻:不要使用DisplayMemberPath。由于 ComboBox 是一个 ItemsControl,因此要在下拉列表中显示解释部分,只需创建一个 DataTemplate(其数据类型设置为 ItemsSource 集合中的对象类型!),并使用 TextBlock 或类似的绑定 Explanation 属性。现在,当在下拉列表中选择一个项目(不使用 DisplayMemberPath)时,放置在编辑字段中的值是该项目的字符串表示形式。因此,在 Value/Explanation 对象类型中,重写 ToString 方法,使其返回 Value。
  • 是的,这确实很骇人听闻,但是嘿 - 它有效!除非出现不那么老套的解决方案,否则我会将其标记为答案。现在只剩下一件小事:当我开始输入一个数字时,组合框会尝试为每个击键从下拉列表中提取一个可能的数字。有没有办法避免这种情况?
  • 添加一个空项作为下拉列表的第一项。
  • 请看下面我的回答。我有一些好消息和一些坏消息。首先是坏消息:我很抱歉让您无缘无故地覆盖 ToString()。没有必要。现在好消息:不必修改“特殊值”类并重写 ToString()。 ;-b

标签: c# wpf combobox binding


【解决方案1】:

使用数据模板在下拉菜单中显示说明文本。

为了在文本编辑字段中显示值,请将 ComboBox 的附加属性 TextSearch.TextPath 设置为您的“特殊值”类型中的值属性的名称。

如果 ComboBox 在输入数字时不应自动完成可能的特殊值,请将其 IsTextSearchEnabled 属性设置为 false。 (请注意,如果您碰巧在编辑字段中输入了一个特殊值,这也会禁用自动选择下拉列表中的特殊值。)

因此,ComboBox 的定义应该类似于:

<ComboBox ItemsSource="{Binding ...}"
          IsEditable="True"
          TextSearch.TextPath="Value"
          IsTextSearchEnabled="False">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Explanation}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2017-05-23
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多