首先:抱歉英语不好,这不是我的母语。
我目前正在开发一个项目,其中我有一个人员列表,我想将其列在组合框中。 我希望组合框能够被过滤,这样就只有我正在搜索的人列出了。
例如,如果我输入组合框“Joh”,则应该只有以“Joh”开头的人,例如“John”,“Johann”,...。
接下来的事情是,我的组合框不是“可编辑的”,我怎样才能使它可以在其中写入?目前它已被“锁定”...
我希望您了解我的问题是什么,以及如何解决它!
WPF 的一大优点是它允许绑定。具体来说,将代码中的属性绑定到 UI 中的控件。因此,要拥有一个过滤的组合框,我会将您拥有的任何对象的列表绑定到组合框,如下所示:
C#:
private List<Person> myList = new List<Person>();
public List<Person> MyList
{
get { return myList; }
set { myList = value; }
}
WPF:
<ComboBox Name="cboObjects" ItemsSource="{Binding MyList}"/>
这会将您的组合框设置为绑定到列表。所以现在我们必须将其过滤掉。因此,接下来我将使用 KeyDown 事件在每次输入组合框时触发。然后在该事件期间,您可以捕获用户的文本,并尝试查找与列表中匹配的任何内容,然后将列表属性设置为等于找到的内容..
private void cboObjects_KeyDown(object sender, KeyEventArgs e)
{
string temp = ((ComboBox)sender).Text;
var newList = MyList.Where(x => x.Name.Contains(temp));
MyList = newList.ToList();
}
现在您的人物对象列表已被过滤!尽管这样做有一些问题,例如您现在不再拥有原始列表。另一件事是,如果您采用这种方法,除非被告知,否则您的 UI 将不会更新。因此,请使用 INotifyPropertyChanged 接口。每当您更新属性时,它基本上都会触发一个事件,然后告诉您的 UI 再次检索该值。
最后,至于您的组合框不可编辑,请尝试设置 IsReadOnly = false 和 IsEditable = true!
这实际上是内置的!
您需要做的是在您的
ComboBox
控件上设置以下属性。
<ComboBox ItemsSource="{Binding PersonList}"
IsTextSearchEnabled="True"
TextSearch.TextPath="Name"/>
此示例假设您有一个类型为
PersonList
的 Person
,其中类型 Person
具有 Name
的属性。
您需要将
TextSearch.TextPath
设置为您想要搜索的任何属性(基于 ItemsSource
集合中项目的属性)。