Ich habe kleine Demo von CollectionViewSource für WPF DataGrid in MVVM implementiert. Ich würde wirklich jede Hilfe schätzen, um die Implementierung zu überprüfen und zu kommentieren, ob dies der richtige Ansatz für die Verwendung von CollectionViewSource ist.CollectionViewSource MVVM-Implementierung für WPF DataGrid
public class ViewModel : NotifyProperyChangedBase
{
private ObservableCollection<Movie> _movieList;
public ObservableCollection<Movie> MovieList
{
get { return _movieList; }
set
{
if (this.CheckPropertyChanged<ObservableCollection<Movie>>("MovieList", ref _movieList, ref value))
this.DisplayNameChanged();
}
}
private CollectionView _movieView;
public CollectionView MovieView
{
get { return _movieView; }
set
{
if (this.CheckPropertyChanged<CollectionView>("MovieView", ref _movieView, ref value))
this.DisplayNameChanged();
}
}
public ViewModel()
{
MovieView = GetMovieCollectionView(MovieList);
}
private void DisplayNameChanged()
{
this.FirePropertyChanged("DisplayName");
}
public void UpdateDataGrid(string uri)
{
MovieView = GetMovieCollectionView(new ObservableCollection<Movie>(MovieList.Where(mov => uri.Contains(mov.ID.ToString())).ToList<Movie>()));
}
public CollectionView GetMovieCollectionView(ObservableCollection<Movie> movList)
{
return (CollectionView)CollectionViewSource.GetDefaultView(movList);
}
Die XAML-Ansicht:
<Window.Resources>
<CollectionViewSource x:Key="MovieCollection" Source="{Binding MovieList}">
</CollectionViewSource>
</Window.Resources>
<DataGrid Name="MyDG"
ItemsSource="{Binding MovieView}"
AutoGenerateColumns="True" />
Die Hinter-Code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Resources.Add("TagVM", new TagViewModel());
this.DataContext = this.Resources["TagVM"];
}
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
string uri = ((Hyperlink)sender).NavigateUri.ToString();
((ViewModel)this.DataContext).UpdateDataGrid(uri);
}
Der Hyperlink_Click Handler ruft die UpdateDataGrid Methode der VM übergeben Sie Film-IDs getrennt Komma, die dann verwendet werden, Filtern Sie die MovieList-Auflistung mithilfe von Erweiterungsmethoden.
Ihr Code ist ein wenig irreführend, bitte überprüfen Sie die Klassennamen. ViewModel, TagViewModel .. so können wir besser verstehen. – HichemSeeSharp
Oh sorry @HichemC, hatte tatsächlich den Klassennamen beim Posten der Frage umbenannt. Vergessen, es im Code dahinter zu ändern. Gute Beobachtung aber. Danke, dass du meine Aufmerksamkeit auf mich gelenkt hast. – Lucifer