如何通过MVVM为DataGrid ItemSource设置过滤器

Ral*_*ton 9 data-binding wpf mvvm

我有一个DataGrid绑定到XAML中的CollectionViewSource.

<Window.Resources>
  <local:MainWindowViewModel x:Key="ViewModel"/>
  <CollectionViewSource x:Key="cvsEntries" 
                        Source="{Binding LogEntriesStore, 
                                 Source={StaticResource ViewModel}}"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

LogEntriesStore是一个ObservableCollection (LogEntry是一个在本次讨论中不重要的DTO)

DataGrid的声明为:

<DataGrid AutoGenerateColumns="False" 
          Margin="0" 
          Name="dataGrid1" 
          ItemsSource="{Binding Source={StaticResource cvsEntries}}" 
          IsReadOnly="True">
Run Code Online (Sandbox Code Playgroud)

现在,我在此DataGrid中的各个单元格上有上下文菜单,以启动过滤请求.右键单击一个单元格,然后选择过滤器以过滤所有行,并仅显示此特定值.

MVVM获取过滤请求,但现在是棘手的一点.如何在CollectionViewSource上设置过滤器?

(顺便说一句 - 这可能是在公园里用Silverlight散步,PagedCollectionView但似乎在WPF中没有,是吗?)

Pav*_*kov 16

非常简单.您只需要在视图模型中移动集合视图:

  1. MainWindowViewModel定义类型的属性时ICollectionView:

    public ICollectionView LogEntriesStoreView { get; private set; }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在初始化LogEntriesStore属性之后,您需要LogEntriesStoreView使用以下代码初始化该属性:

    LogEntriesStoreView = CollectionViewSource.GetDefaultView(LogEntriesStore);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,您需要CollectionViewSource从XAML中删除并修改ItemsSource绑定以指向新创建的集合视图属性:

    <DataGrid AutoGenerateColumns="False" 
              Margin="0" 
              Name="dataGrid1" 
              ItemsSource="{Binding LogEntriesStoreView, Source={StaticResource ViewModel}}" 
              IsReadOnly="True">
    
    Run Code Online (Sandbox Code Playgroud)

而已.现在,您可以访问视图模型中的集合视图,您可以在其中修改过滤器.