2011-04-27 62 views
8

我有一個DataGrid綁定到XAML中的CollectionViewSource如何通過MVVM爲DataGrid ItemSource設置篩選器

<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中的各種單元格上的菜單,踢o如果是過濾請求。右鍵單擊一個單元格,然後選擇過濾器來過濾所有行,並僅顯示該特定值。

MVVM獲取過濾請求,但現在是棘手的位。如何在CollectionViewSource上設置過濾器?

(順便說一句 - 這將是在公園裏散步用的Silverlight PagedCollectionView但是這似乎並沒有在WPF可用,是這樣嗎?)

+1

這是你在找什麼HTTP://bea.stollnitz .com/blog /?p = 31 – 2011-04-27 20:23:51

回答

15

很簡單。你只需要移動集合視圖的視圖模型裏面:

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

就是這樣。現在您可以訪問視圖模型中的集合視圖,您可以在其中修改過濾器。

+0

該方法的問題是ICollectionView是隻讀的,如果默認情況下您將被阻止添加/刪除行。因此我推薦使用ListCollectionView。 – 2016-06-09 07:39:43