【问题标题】:How to set a filter for a DataGrid ItemSource via MVVM如何通过 MVVM 为 DataGrid ItemSsource 设置过滤器
【发布时间】:2011-08-14 04:07:52
【问题描述】:

我有一个 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 中不可用,对吗?)

【问题讨论】:

标签: wpf data-binding mvvm


【解决方案1】:

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

  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">
    

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

【讨论】:

  • ICollectionView 是只读的这种方法的问题,因此默认情况下您将被阻止添加/删除行。因此,我建议改用 ListCollectionView。
  • 在 .net 标准中,ICollectionView 不再可用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2020-10-13
    • 2020-06-07
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多