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

时间:2011-04-27 20:06:53

标签: wpf data-binding mvvm

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

<Window.Resources>
  <local:MainWindowViewModel x:Key="ViewModel"/>
  <CollectionViewSource x:Key="cvsEntries" 
                        Source="{Binding LogEntriesStore, 
                                 Source={StaticResource ViewModel}}"/>
</Window.Resources>

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

DataGrid 声明为:

<DataGrid AutoGenerateColumns="False" 
          Margin="0" 
          Name="dataGrid1" 
          ItemsSource="{Binding Source={StaticResource cvsEntries}}" 
          IsReadOnly="True">

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

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

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

2 个答案:

答案 0 :(得分:16)

很简单。您只需要在视图模型中移动集合视图:

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

    public ICollectionView LogEntriesStoreView { get; private set; }
    
  2. 在初始化LogEntriesStore属性后,您需要使用以下代码初始化LogEntriesStoreView属性:

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

    <DataGrid AutoGenerateColumns="False" 
              Margin="0" 
              Name="dataGrid1" 
              ItemsSource="{Binding LogEntriesStoreView, Source={StaticResource ViewModel}}" 
              IsReadOnly="True">
    
  4. 就是这样。现在,您可以访问视图模型中的集合视图,您可以在其中修改过滤器。

答案 1 :(得分:1)

您的问题有几种解决方案,但在我看来,最佳解决方案是仅使用标准WPF DataGrid控件的样式而不发明新的继承DataGird类型或依赖于另一个第三方控制。以下是我发现的最佳解决方案: