Ich habe ein DataGrid an eine CollectionViewSource in XAML gebunden.
%Vor% LogEntriesStore
ist eine ObservableCollection ( LogEntry ist ein DTO, das in dieser Diskussion nicht wichtig ist)
Das DataGrid wird wie folgt deklariert:
%Vor%Jetzt habe ich Kontextmenüs in verschiedenen Zellen in diesem DataGrid , um eine Filteranfrage zu starten. Klicken Sie mit der rechten Maustaste auf eine Zelle und wählen Sie Filter, um alle Zeilen zu filtern und nur diesen bestimmten Wert anzuzeigen.
Der MVVM bekommt die Anforderung zu filtern, aber das ist jetzt das knifflige Bit. Wie setze ich den Filter für die CollectionViewSource?
(nebenbei - das wäre ein Spaziergang im Park mit Silverlight PagedCollectionView
gewesen, aber das scheint in WPF nicht verfügbar zu sein, stimmt das?)
Sehr einfach. Sie müssen nur die Sammlungsansicht in das Ansichtsmodell verschieben:
In MainWindowViewModel
definieren Sie eine Eigenschaft vom Typ ICollectionView
:
Gleich nachdem Sie die Eigenschaft LogEntriesStore
initialisiert haben, müssen Sie die Eigenschaft LogEntriesStoreView
mit dem folgenden Code initialisieren:
Dann müssen Sie die CollectionViewSource
aus XAML entfernen und die Bindung ItemsSource
so ändern, dass sie auf die neu erstellte Sammlungsansichtseigenschaft zeigt:
Das ist es. Jetzt haben Sie Zugriff auf die Sammlungsansicht in Ihrem Ansichtsmodell, in der Sie den Filter ändern können.
Es gibt mehrere Lösungen für Ihr Problem, aber meiner Meinung nach sind die besten Lösungen diejenigen, die nur Styles mit dem Standard-WPF DataGrid
-Steuerelement verwenden, ohne einen neuen geerbten DataGird
-Typ zu erfinden oder von einem anderen Drittanbieter abhängig zu sein Steuerung. Die folgenden sind die besten Lösungen, die ich gefunden habe:
Tags und Links wpf data-binding mvvm