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

问题描述 投票:0回答:3

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

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

LogEntriesStore
是一个 ObservableCollectionLogEntry 是一个 DTO,在本次讨论中并不重要)

DataGrid 声明为:

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

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

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

(顺便说一句 - 这就像在公园里用 Silverlight 散步一样轻松

PagedCollectionView
,但 WPF 中似乎不提供这种功能,是吗?)

wpf data-binding mvvm
3个回答
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">
    

就是这样。现在您可以访问视图模型内的集合视图,您可以在其中修改过滤器。


1
投票

您的问题有多种解决方案,但在我看来,最好的解决方案是仅使用标准 WPF

DataGrid
控件的样式,而不发明新的继承
DataGird
类型或依赖于其他第三方控件。以下是我找到的最佳解决方案:


0
投票

我还有一个问题。我也这样做。但是我现在如何处理 ObservableCollection 中模型的属性更改呢?无论如何,它不会在模具视图中刷新。

© www.soinside.com 2019 - 2024. All rights reserved.