Sim*_*n T 6 validation wpf combobox
使用以下简单文本框作为示例:
<ComboBox IsEditable="True" SelectedItem="{Binding}">
<ComboBoxItem>Angus/ComboBoxItem>
<ComboBoxItem>Jane</ComboBoxItem>
<ComboBoxItem>Steve</ComboBoxItem>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
我想允许用户通过输入名称来查找他们的选择,所以我将IsEditable设置为等于true.绑定到SelectedItem的属性的可接受值是列表中的任何一个选项,或者没有选择(null).问题是,如果某人键入不在列表中的名称,则默认情况下没有错误指示.
例如:用户可以键入"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>
Run Code Online (Sandbox Code Playgroud)
上面的代码片段是提供您正在寻找的“视觉指示”的最佳方式。如果用户输入“h”,则“hello”将出现在输入文本框中。然而,这本身并没有阻止用户输入非法字符的机制。
4)这是一个更高级的版本:
<ComboBox Name="myComboBox" IsEditable="true" KeyUp="myComboBox_KeyUp">
<ComboBoxItem Content="Hello"/>
<ComboBoxItem Content="World"/>
<ComboBoxItem Content="WPF"/>
<ComboBoxItem Content="ComboBox"/>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
隐藏代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,一旦我们检测到没有组合框项目以文本框中的文本开头,我们就不会让用户继续输入。我们删除添加的字符并等待另一个字符。