我一直在尝试扩展 Josh Smith 的演示 MVVM 应用程序,以便更好地理解其背后的原理,并且在尝试使用 ListView 在 View 上实现过滤器功能时遇到了困难。
我花了几个小时研究和涉足,但它只是不起作用。
我的第一步是将视图中的文本框绑定到 ViewModel 中的属性:
<TextBox Height="25" Name="txtFilter" Width="150" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}"/>
这在我的虚拟机中匹配:
public string Filter
{
get { return this.filter; }
set
{
this.filter = value;
OnFilterChanged();
}
}
我的虚拟机使用 ObservableCollection 作为数据源,但我在阅读教程后尝试将其转换为 ICollectionView:
internal ObservableCollection<StaffViewModel> InnerStaff { get; set; }
internal CollectionViewSource CvsStaff { get; set; }
public ICollectionView AllStaff
{
get { return CvsStaff.View; }
}
在我的构造函数中,我指定了:
CvsStaff = new CollectionViewSource();
CvsStaff.Source = this.InnerStaff;
CvsStaff.Filter += ApplyFilter;
当我的过滤器属性更新时,它会调用 OnFilterChanged,即:
private void OnFilterChanged()
{
CvsStaff.View.Refresh();
}
我的 ApplyFilter 功能是:
void ApplyFilter(object sender, FilterEventArgs e)
{
StaffViewModel svm = (StaffViewModel)e.Item;
if (this.Filter.Length == 0)
{
e.Accepted = true;
}
else
{
e.Accepted = svm.LastName.Contains(Filter);
}
}
我是否犯了一个愚蠢的错误,任何人都可以帮助我发现?我对 WPF 和 MVVM 模式还很陌生,所以我还在学习!
编辑
在视图中,我将集合绑定到:
<CollectionViewSource
x:Key="StaffGroup"
Source="{Binding Path=AllStaff}"
/>
ListView 是这样的:
<ListView
Name="staffList"
AlternationCount="2"
DataContext="{StaticResource StaffGroup}"
ItemContainerStyle="{StaticResource StaffItemStyle}"
ItemsSource="{Binding}"
Grid.Row="1">