如何使 WPF 组合框拉取特定属性

3
我想使用组合框来输入纯整数值。
在我的应用程序中,一些数字值具有特殊含义,但可以输入任何数字值(键入)。
因此,组合框必须显示一个带有向右的下拉箭头的编辑字段。
如果单击下拉箭头,则下拉列表必须呈现那些具有特殊含义的特殊数字值的解释(字符串)列表(例如“103-等待下一个回合”)。
如果用户从下拉列表中单击条目(而不是直接输入相应的值),则必须将相应的数字值传输到编辑字段。
我尝试了以下内容:
- 我将ComboBox的IsEditable属性设置为true - 我将ItemsSource属性绑定到一个对象集合,这些对象具有数字属性(命名为“Value”)和字符串属性(命名为“Explanation”)。 - 我将DisplayMemberPath属性设置为“Explanation”(上述字符串属性的名称)
有了这些,我可以自由地键入任何我喜欢的数字,并且每个特殊数字的字符串解释都会正确显示在下拉列表中。这正是我想要的。
然而,当我从下拉列表中选择一个解释时,传输到编辑字段的是解释字符串,而不是相应的数字值。
问题:如何使组合框在我从下拉列表中点击项目时传输数字属性(“Value”)而不是解释文本?

好的,以下是一些比较hackish的代码:不要使用DisplayMemberPath。由于ComboBox是一个ItemsControl,为了在下拉列表中显示说明部分,只需要创建一个DataTemplate(其数据类型设置为ItemsSource集合中对象的类型!)并使用TextBlock或类似绑定来绑定Explanation属性。现在,在选择下拉列表中的项时(不使用DisplayMemberPath),放置在编辑字段中的值是该项的字符串表示形式。因此,在Value/Explanation对象类型中,重写ToString方法使其返回Value。 - user2819245
是的,那确实有些不规范,但嘿——它能用!除非出现更好的解决方案,我会将其标记为答案。现在只剩下一个小问题:当我开始输入数字时,组合框会尝试从下拉列表中拉入可能的数字。有没有办法避免这种情况发生? - Martin Christiansen
在下拉列表的第一项添加一个空项目。 - Olivier Jacot-Descombes
请看下面我的回答。我有好消息和坏消息。先说坏消息:很抱歉让你无意义地覆盖_ToString()_方法,这是不必要的。现在说好消息:不需要修改你的“特殊值”类并覆盖_ToString()_方法。;-b - user2819245
1个回答

0

使用数据模板在下拉列表中显示解释文本。

要在文本编辑字段中显示值,请为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>

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