谈到写这篇博客的缘由,还得从最近的一项工作说起,最近有一项工作基本功能都已完成。但是有一点就是combobox下拉框绑定的数据项较多,每次选择都要点开下拉框进行选择。于是我就想能不能通过模糊查询的方式来重新加载列表。
首先,自然而然的,我想到用combobox事件来实现模糊查询功能,暂且将该combobox命名为Combobox,于是我就开始尝试,为该combobox设定了一个事件,该事件为MouseLeave,该事件定为MouseLeave=Combobox__MouseLeave,在该事件里写方法。方法如下:
private void Combobox_MouseLeave(object sender, MouseEventArgs e)
{
if (string.IsNullOrEmpty(Combobox.Text))
{
Combobox.ItemsSource = ListFull; //当Combobox输入为空时,将列表所有项加载进来
Combobox.Items.Refresh();
return;
}
else
{
string str = Combobox.Text.Trim();
List<Model> list = new List<Model>(); //实例化实体列表
if(model的一个属性值包含Combobox.Text)
{
list.Add(model);
}
}
Combobox.ItemsSource = list;
if (Combobox.IsDropDownOpen == false)
{
Combobox.IsDropDownOpen = true;
}
Combobox.Items.Refresh();
}
然而,写完以后,编译运行发现每次输入一个字符并不会进该事件,只有输入多个字符,并且鼠标未移开也不进该事件。但是多少有了一点雏形了,下来就要改进。通过查阅资料,我发现combobox是有好几个空间共同组合而成的。于是我就开始写了一个textchange事件,将该事件的方法拷贝进textchange事件,然而要想调该事件,就还需要在该MouseLeave事件里调。
最终的后台代码为:
private void Combobox_MouseLeave(object sender, MouseEventArgs e)
{
((TextBox)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this. Combobox, 0), 2)).TextChanged //这里的2代表该控件由三个控件组合而成,Textbox是第一个
+= new TextChangedEventHandler(TextChanged);
}
//文本框输入改变事件
private void TextChanged(object sender, TextChangedEventArgs e)
{
if (string.IsNullOrEmpty(Combobox.Text))
{
Combobox.ItemsSource = ListFull; //当Combobox输入为空时,将列表所有项加载进来
Combobox.Items.Refresh();
return;
}
else
{
string str = Combobox.Text.Trim();
List<Model> list = new List<Model>(); //实例化实体列表
if(model的一个属性值包含Combobox.Text)
{
list.Add(model);
}
}
Combobox.ItemsSource = list;
if (Combobox.IsDropDownOpen == false)
{
Combobox.IsDropDownOpen = true;
}
Combobox.Items.Refresh();
}
写完后,我再次编译,运行,发现现在加载的列表会随着输入内容的改变而改变并会将列表展开。至此用户体验满意度就会提高一些!