我一直在尝试扩展Josh Smith的演示MVVM应用程序,以便更好地理解它背后的原理,并且当我尝试使用ListView在View上实现过滤器功能时,我遇到了障碍.
我花了几个小时研究和涉猎,但它只是没有用.
我的第一步是将视图中的文本框绑定到ViewModel中的属性:
<TextBox Height="25" Name="txtFilter" Width="150" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)
这在我的VM中匹配:
public string Filter
{
get { return this.filter; }
set
{
this.filter = value;
OnFilterChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
我的VM使用ObservableCollection作为数据源,但我在阅读教程后尝试将其转换为ICollectionView:
internal ObservableCollection<StaffViewModel> InnerStaff { get; set; }
internal CollectionViewSource CvsStaff { get; set; }
public ICollectionView AllStaff
{
get { return CvsStaff.View; }
}
Run Code Online (Sandbox Code Playgroud)
在我的构造函数中,我指定:
CvsStaff = new CollectionViewSource();
CvsStaff.Source = this.InnerStaff;
CvsStaff.Filter += ApplyFilter;
Run Code Online (Sandbox Code Playgroud)
当我的Filter属性更新时,它调用OnFilterChanged,它是:
private void OnFilterChanged()
{
CvsStaff.View.Refresh();
}
Run Code Online (Sandbox Code Playgroud)
我的ApplyFilter函数是:
void ApplyFilter(object sender, FilterEventArgs e)
{
StaffViewModel …Run Code Online (Sandbox Code Playgroud)