Implementé una pequeña demostración de CollectionViewSource para WPF DataGrid en MVVM. Realmente agradecería cualquier ayuda para verificar la implementación y comentar si este es el enfoque correcto para usar CollectionViewSource.Implementación CollectionViewSource MVVM para 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);
}
El XAML Vista:
<Window.Resources>
<CollectionViewSource x:Key="MovieCollection" Source="{Binding MovieList}">
</CollectionViewSource>
</Window.Resources>
<DataGrid Name="MyDG"
ItemsSource="{Binding MovieView}"
AutoGenerateColumns="True" />
el código subyacente:
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);
}
El manejador Hyperlink_Click invoca el método UpdateDataGrid de la máquina virtual de pasarlo por comas separó ID de la película, que luego se utilizan para filtrar la colección MovieList usando métodos de extensión.
Su código es un poco engañoso, verifique los nombres de las clases. ViewModel, TagViewModel ... para que podamos entender mejor. – HichemSeeSharp
Oh, lo siento @HichemC, en realidad había cambiado el nombre de la clase al publicar la pregunta. Olvidé cambiarlo en el código detrás. Buena observación sin embargo. Gracias por llamar mi atención. – Lucifer