29

我在 WPF 中有一个 ComboBox,我用过很多次(它有一个自定义模板和一个自定义项模板)。我现在已经达到了它几乎可以按照我想要的方式工作的地步,除了当我在 ComboBox 中键入时,它正在为我进行过滤,但仅在假设我键入的内容开始时进行过滤组合框。

例如,如果我在 ComboBox 中有一个名为“Windows Media Player”的项目,它只会在我开始输入“Windows Media ...”时找到它,如果我开始输入“Media Play...”,它将找不到它. 有没有办法解决?我可以在某处设置一个属性来告诉它在整个字符串中搜索,而不仅仅是使用 StartsWith() 吗?

如果没有,最好的方法是让我自己做到这一点?有什么方法可以获取原始控制权,基本上只是将对 StartsWith() 的调用更改为对 Contains() 的调用,还是我必须走得更底层?

4

5 回答 5

39

组合框现在支持自动完成,只需确保在 xaml 中放置组合框

IsEditable="True"
于 2011-11-30T22:21:03.270 回答
8

查看 CodeProject 中的以下文章: A Reusable WPF Autocomplete TextBox

于 2009-12-30T20:25:10.060 回答
4

据我所知,仅通过更改设置无法强制标准 ComboBox 以这种方式运行。因此,您必须为此实现自己的组合框衍生工具,或者搜索现成的第 3 方控件(我相信它们有很多)。

于 2009-02-09T08:45:28.097 回答
4

您可以尝试处理 ComboBox 的 TextInput 或 PreviewTextInput 事件,自己进行文本搜索,选择最合适的项目,并设置“e.Handled = true”。只是一个想法。希望这可以帮助!

编辑:

这适用于单个字符(即,如果您输入字母“j”,它将选择包含“j”或“J”的第一个项目),但我确信有一种方法可以使用您的控件来执行此操作。享受!

private void MyComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e) {
    foreach (ComboBoxItem i in MyComboBox.Items) {
        if (i.Content.ToString().ToUpper().Contains(e.Text.ToUpper())) {
            MyComboBox.SelectedItem = i;
            break;
        }
    }
    e.Handled = true;
}
于 2009-02-18T03:06:48.110 回答
2

WPF 组合框不支持自动完成

这是一个示例,它允许您通过对项目应用过滤器以间接方式执行此操作。

请参阅http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cec1b222-2849-4a54-bcf2-03041efcf304/

于 2009-02-18T07:58:46.957 回答