首先:抱歉英语不好,不是我的第一语言。
我目前正在开展一个项目,其中列出了我想在组合框中列出的人员列表。 我想要对组合框进行过滤,以便只列出我搜索的人。
例如,如果我输入组合框“Joh”,那么应该只有“约翰”,“约翰”这样的“约翰”开头......,
接下来的事情是,我的组合框不是“可编辑的”,我怎么能把它写进去呢?目前它被“锁定”......
我希望你能理解我的问题,以及如何解决它!
答案 0 :(得分:2)
这实际上是内置的!
您需要做的是在ComboBox
控件上设置以下属性。
<ComboBox ItemsSource="{Binding PersonList}"
IsTextSearchEnabled="True"
TextSearch.TextPath="Name"/>
此示例假设您的PersonList
类型为Person
,其中Person
类型的属性为Name
。
您需要将TextSearch.TextPath
设置为您要搜索的任何属性(基于ItemsSource
集合中项目的属性)。
答案 1 :(得分: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}"/>
将你的组合框设置为绑定到列表。所以现在我们必须将其过滤掉。接下来我会在每次输入Combobox时使用KeyDown事件触发。然后在那个事件期间你可以捕获用户的文本,并尝试找到与列表中的匹配的任何内容,然后将list属性设置为等于找到的内容..
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!