如何过滤我的WPF组合框?

问题描述 投票:0回答:2

首先:抱歉英语不好,这不是我的母语。

我目前正在开发一个项目,其中我有一个人员列表,我想将其列在组合框中。 我希望组合框能够被过滤,这样就只有我正在搜索的人列出了。

例如,如果我输入组合框“Joh”,则应该只有以“Joh”开头的人,例如“John”,“Johann”,...。

接下来的事情是,我的组合框不是“可编辑的”,我怎样才能使它可以在其中写入?目前它已被“锁定”...

我希望您了解我的问题是什么,以及如何解决它!

c# wpf combobox
2个回答
0
投票

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!


0
投票

这实际上是内置的!

您需要做的是在您的

ComboBox
控件上设置以下属性。

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

此示例假设您有一个类型为

PersonList
Person
,其中类型
Person
具有
Name
的属性。

您需要将

TextSearch.TextPath
设置为您想要搜索的任何属性(基于
ItemsSource
集合中项目的属性)。

更多信息,请参阅 https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.combobox.istextsearchenabled

© www.soinside.com 2019 - 2024. All rights reserved.