在WPF中的任何地方自动完成ComboBox的文本(不仅仅是开始)

时间:2009-02-06 22:34:13

标签: c# .net wpf combobox

我在WPF中有一个ComboBox,我已经用了很多东西(它有一个自定义模板和一个自定义项目模板)。我已经明白了它现在几乎是我想要它的工作方式,除了当我输入ComboBox时它正在为我做过滤,但只有过滤器假设我输入的内容才会启动项目的名称ComboBox。

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

如果没有,那么自己做这件事最好的方法是什么?有没有办法采取原始控件,基本上只是将对StartsWith()的调用更改为对Contains()的调用,或者我是否必须更低级别?

5 个答案:

答案 0 :(得分:38)

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

IsEditable="True"

答案 1 :(得分:8)

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

答案 2 :(得分:4)

据我所知,只需更改设置就无法强制标准ComboBox以这种方式运行。因此,你必须为此实现自己的组合框衍生产品或搜索现成的第三方控件(我相信它们有很多)。

答案 3 :(得分: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;
}

答案 4 :(得分:2)

WPF组合框不支持自动填充

以下示例允许您通过对项目应用过滤器以间接方式执行此操作。

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