以下面的简单文本框为例:

<ComboBox IsEditable="True" SelectedItem="{Binding}">
    <ComboBoxItem>Angus/ComboBoxItem>
    <ComboBoxItem>Jane</ComboBoxItem>
    <ComboBoxItem>Steve</ComboBoxItem>
</ComboBox>


我想允许用户通过输入名称来找到他们的选择,因此我将IsEditable设置为true。绑定到SelectedItem的属性的可接受值是列表中的任何一个选项,或者没有选择(空)。问题是,如果有人键入不在列表中的名称,则默认情况下没有错误指示。

例如:用户可以键入“ Bob”,从而导致SelectedItem属性为null,但不会意识到列表中不存在Bob。相反,我想在ComboBox的Text属性不为null或为空并且SelectedItem为null时立即提供视觉指示,并阻止他们再输入什么?

我最初的想法是自定义验证规则,但是我不知道如何访问组合框的Text和SelectedItem属性。

最佳答案

首先,您可能希望让用户查看他们是否在键入可用选项之一。

1)在线搜索“自动完成组合框”。

2)检查这些:

http://weblogs.asp.net/okloeten/archive/2007/11/12/5088649.aspx

http://www.codeproject.com/KB/WPF/WPFCustomComboBox.aspx

3)也试试这个:

    <ComboBox IsEditable="true" TextSearch.TextPath="Content">
        <ComboBoxItem Content="Hello"/>
        <ComboBoxItem Content="World"/>
    </ComboBox>


上面的代码段是提供您正在寻找的“视觉指示”的一种原始方法。如果用户键入“ h”,则“ hello”将出现在输入文本框中。但是,这本身并没有阻止用户输入非法字符的机制。

4)这是一个更高级的版本:

    <ComboBox Name="myComboBox" IsEditable="true" KeyUp="myComboBox_KeyUp">
        <ComboBoxItem Content="Hello"/>
        <ComboBoxItem Content="World"/>
        <ComboBoxItem Content="WPF"/>
        <ComboBoxItem Content="ComboBox"/>
    </ComboBox>


后台代码:

    private void myComboBox_KeyUp(object sender, KeyEventArgs e)
    {
        // Get the textbox part of the combobox
        TextBox textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox;

        // holds the list of combobox items as strings
        List<String> items = new List<String>();

        // indicates whether the new character added should be removed
        bool shouldRemove = true;

        for (int i = 0; i < myComboBox.Items.Count; i++)
        {
            items.Add(((ComboBoxItem)myComboBox.Items.GetItemAt(i)).Content.ToString());
        }

        for (int i = 0; i < items.Count; i++)
        {
            // legal character input
            if(textBox.Text != "" && items.ElementAt(i).StartsWith(textBox.Text))
            {
                shouldRemove = false;
                break;
            }
        }

        // illegal character input
        if (textBox.Text != "" && shouldRemove)
        {
            textBox.Text = textBox.Text.Remove(textBox.Text.Length - 1);
            textBox.CaretIndex = textBox.Text.Length;
        }
    }


在此,一旦我们检测到没有组合框项目以文本框中的文本开头,我们就不允许用户继续输入。我们删除添加的字符,然后等待另一个字符。

关于wpf - 具有IsEditable =“True”的WPF ComboBox-如何指示未找到匹配项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4609847/

10-11 23:23