如何在WPF组合框中通过键盘字母键选择项目?

21

我有一个 WPF 的 ComboBox,当我输入以 "e" 开头的字母时,我想要跳转到以该字母开头的项目。如何实现?

我的 XAML 代码:

<ComboBox ItemsSource="{Binding Roles}" SelectedValuePath="Id"
          ItemTemplate="{StaticResource ComboBoxDisplayName}"
          SelectedItem="{Binding SelectedRole}"
          Width="150"/> 
3个回答

26

编辑: 我猜你有一个类似这样的ItemTemplate:

<StackPanel>
    <TextBlock Text="{Binding Path=Foo}" />
    <TextBlock Text="{Binding Path=Bar}" />
</StackPanel>

如果你想要在Foo上进行搜索,请尝试...

<ComboBox IsEditable = "True" TextSearch.TextPath = "Foo" />

默认情况下,ComboBox 具有一种自动完成功能,它会根据第一个字母找到匹配项 - 假设你的源已按字母顺序排序,则将选定的项目移至以“e”开头的部分。

如果您期望有几个以相同字母开头的条目,则捕获 KeyDown 以强制打开下拉列表可能会很有用。


1
是的,我可以编辑组合框,但它没有找到我搜索的数据。只是启用了编辑。?? - NetSide
1
而我只想跳,这对我来说已经足够了。 - NetSide
1
<DataTemplate x:Key="ComboBoxDisplayName"> <ContentPresenter Content="{Binding Name}"/> </DataTemplate> - NetSide
1
名称是字符串吗?您为什么将它放在ContentPresenter中而不是TextBlock或其他地方呢? - MoominTroll
2
实际上,不需要添加IsEditable,只需添加如下内容即可: IsTextSearchEnabled="True" TextSearch.TextPath="Name" - NetSide
显示剩余3条评论

15

假设您的项目按字母顺序排序,只需设置IsTextSearchEnabled="True"就可以跳转到以您在ComboBox中输入的字母开头的项目。

这是我的一个ComboBox的示例,我已简化绑定,因为显然不是这里的重点...

<ComboBox ItemsSource="{Binding MyObjectList}"
          DisplayMemberPath="Description"
          SelectedValuePath="Code"
          IsTextSearchEnabled="True"/>

这对于从列表中选择值来说非常完美,但是,由于我已将IsEditable设置为false,所以您输入的搜索值将不会在控件的TextBox部分中显示。

如果有人可以解释为什么会被投票否决,那将不胜感激。我认为我的回答没有任何问题,并且认为我只是在提供帮助(并且提供了一个合理的答案!)


1
我看不到TextSearchEnabled? - NetSide
1
+1 - 这应该不会被下投票,尤其不是两次!这同样有效,特别是现在我们知道问题是模板的原因。 - MoominTroll
IsTextSearchEnabled在Items中调用ToString()方法 - 如果您有自定义对象,即不是字符串,则它似乎不起作用,因为将调用ToString()方法,这将给出类似"MyObject"的内容,除非您在自定义对象中覆盖ToString()方法以输出例如Code属性... - markmnl
我怀疑你被踩的原因更多是因为你误用了WPF并且使用了非常“winforms”的方式,即使用DisplayMemberPath而不是使用DataTemplate。 - MikeKulls
1
使用 DisplayMemberPath 是一种非常有效且简单的方法,使用 DataTemplates 来做所有事情则是过度设计,在我看来。虽然这可能被认为是“WinForms”的做法,但在开始 WPF 之前我甚至从未使用过 WinForms(不幸的是现在我被困在使用 WinForms)。 - TabbyCool
显示剩余3条评论

0

我所需要做的就是添加以下内容:

TextSearch.TextPath="<what ever you bound to goes here> ie:State or name "

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