我在WPF中有一个列表框,其中列出了用户的名字和姓氏。我有一个文本框,我试图按名称进行过滤。以下是我正在尝试的内容:(当我在文本框中输入时,没有任何内容被过滤)
这是我的VM
#region Members
private CollectionViewSource usercvs = new CollectionViewSource();
private string searchString;
#endregion
#region Properties
public string SearchFilter
{
get
{
return this.searchString;
}
set
{
if (!string.IsNullOrEmpty(this.searchString))
AddFilter();
usercvs.View.Refresh();
this.searchString = value;
}
}
#endregion
#region Methods
private void AddFilter()
{
usercvs.Filter -= new FilterEventHandler(Filter);
usercvs.Filter += new FilterEventHandler(Filter);
}
private void Filter(object sender, FilterEventArgs e)
{
// see Notes on Filter Methods:
var src = e.Item as User;
if (src == null)
e.Accepted = false;
else if (src.LastName != null && !src.LastName.Contains(SearchFilter))
e.Accepted = false;
}
#endregion
}
}
答案 0 :(得分:3)
向ViewModel添加一个额外的属性,公开CollectionViewSource并将ListBox绑定到该属性。
public CollectionViewSource FilteredUsers{
get {
return usercvs.View;
}
}
当您对ObservableCollection
应用任何过滤器时,CollectionViewSource
不会更改,因此您将始终看到所有项目。 Filter将应用于CollectionViewSource,并且可以通过类的View属性访问过滤后的结果。
答案 1 :(得分:2)
有了这个
public ICollectionView FilteredUsers
{
get
{
return usercvs.View;
}
}