2011-08-26 59 views
6

为了澄清我有绑定到其的ItemSource属性可观察集合的组合框。我希望用户只能输入集合中存在的项目。同时保持如何限制用户输入一个组合框,好让你只能输入是集合内的话吗?

IsTextSearchEnabled="true" 

功能。 所以我一直在网上寻找关于如何做到这一点的例子。直到现在我想我应该使用

<ComboBox TextInput="cbb1_TextInput" /> 

事件,然后搜索集合。但我微弱的尝试不能保持自动完成功能,selectedindex变得混乱和其他不需要的行为。由于我在wpf中是个不错的选择,我想知道是否有只使用XAML部分的解决方案?

编辑: 我想是这样的:

 private void fase1cbb1_KeyUp(object sender, KeyEventArgs e) 
    { 
     ComboBox cb = (ComboBox)sender; 
     bool match = false; 
     TextBox tb = (TextBox)cb.Template.FindName("PART_EditableTextBox", cb); 
     if (tb.Text.Length > 0) 
     { 
      foreach (MenuItem MI in cb.Items) 
      { 
       if (MI.Text.StartsWith(tb.Text)) 
       { 
        match = true; ; 
       } 
      } 
      if (!match) 
      { 
       int len = tb.Text.Length; 
       if (len > 0) 
       { 
        tb.Text = tb.Text.Substring(0, len - 1); 
        tb.SelectionStart = len; 

       } 
      } 
     } 
    } 

但只要没有比赛了没有更多选择的项目,并没有更多的自动完成/ TEXTSEARCH。

日Thnx的任何意见或例子。

SOLUTION: WPF ComboBox with IsEditable="True" - How can I indicate that no match was found?

+0

我不会用KeyUp事件。是不是有一个BeforeValueChange或类似的东西? (不确定,我主要使用infragistics)如果是这样,你可以检查新文本是否匹配项目。如果不是,则取消文本更改事件。 – Tipx

回答

2

如果滚动一路下跌到MSDN上的ComboBox文档的底部,你会发现,有一个非常简单的可能的答案:设置你的ComboBox.IsEditable为false。用户仍然可以通过在框中键入前缀来选择编辑器中的项目,但他们只能输入已经出现在列表中的值。

的缺点是,你没有得到任何正常的“文本框”般的行为,特别是,你不能复制/粘贴所选项目进行组合框的。如果这也是你的一个问题,让我们知道,但这是在Windows DropDownList的样式组合框的典型行为反正。

+0

好的建议,我试过了,它几乎是我要找的。只有现在,用户不能看到他/她正在输入什么。 IsEditable = false时可能吗? – Daanvl