我已经在MVVM中为WPF DataGrid实现了CollectionViewSource的小型演示。我真的很感谢任何帮助来验证实现,并评论这是否是使用CollectionViewSource的正确方法。CollectionViewSource针对WPF DataGrid的MVVM实现
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);
}
的XAML检视:
<Window.Resources>
<CollectionViewSource x:Key="MovieCollection" Source="{Binding MovieList}">
</CollectionViewSource>
</Window.Resources>
<DataGrid Name="MyDG"
ItemsSource="{Binding MovieView}"
AutoGenerateColumns="True" />
后面的代码:
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);
}
的Hyperlink_Click处理程序调用VM的UpdateDataGrid方法传递逗号分隔电影标识,其然后被用于使用扩展方法过滤MovieList集合。
您的代码有点误导,请验证类名。 ViewModel,TagViewModel ..所以我们可以更好地理解。 – HichemSeeSharp
对不起@HichemC,实际上在发布问题时已经重命名了类名。忘记在后面的代码中改变它。虽然好的观察。感谢您的关注。 – Lucifer