如何过滤我的WPF组合框?

fdbelqdn  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(127)

第一点:很抱歉我的英语不好,这不是我的第一语言。
我目前正在做一个项目,我有一个人的列表,我想在一个组合框中列出。我想组合框得到过滤,这样就只有我搜索的人列出了。
例如,如果我在组合框中输入“约翰”,应该只有像“约翰”,“约翰”,...这样以“约翰”开头的人。
接下来的事情是,我的组合框不是“可编辑”的,我怎么能让它让我可以在里面写呢?目前它是“锁定”的...
我希望你明白我的问题是什么,以及如何解决它!

nbewdwxp

nbewdwxp1#

所以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将不会更新,除非它被告知。2所以使用INotifyPropertyChanged接口。它实际上会在您更新属性时触发一个事件,然后通知UI再次检索该值。
最后,对于不可编辑的组合框,尝试设置IsReadOnly = false,IsEditable = true!

ktca8awb

ktca8awb2#

这其实是内置的!
您需要做的是在ComboBox控件上设置以下属性。

<ComboBox ItemsSource="{Binding PersonList}"
          IsTextSearchEnabled="True" 
          TextSearch.TextPath="Name"/>

这个范例假设您有Person型别的PersonList,其中Person型别有Name属性。
您需要将TextSearch.TextPath设置为要搜索的任何属性(基于ItemsSource集合中项目的属性)。
更多信息,请参阅https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.combobox.istextsearchenabled

相关问题