Tôi đã triển khai bản demo nhỏ của CollectionViewSource cho WPF DataGrid trong MVVM. Tôi thực sự đánh giá cao bất kỳ sự trợ giúp nào để xác minh việc thực hiện và nhận xét về việc đây có phải là cách tiếp cận đúng để sử dụng CollectionViewSource hay không.CollectionViewSource MVVM thực hiện cho 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);
}
Các XAML Xem:
<Window.Resources>
<CollectionViewSource x:Key="MovieCollection" Source="{Binding MovieList}">
</CollectionViewSource>
</Window.Resources>
<DataGrid Name="MyDG"
ItemsSource="{Binding MovieView}"
AutoGenerateColumns="True" />
Bộ luật Đằng sau:
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);
}
Việc xử lý Hyperlink_Click gọi phương thức UpdateDataGrid của VM đi qua nó dấu phẩy tách ID phim mà sau đó được sử dụng để lọc bộ sưu tập MovieList bằng các phương thức mở rộng.
Mã của bạn hơi gây hiểu nhầm, vui lòng xác minh tên lớp. ViewModel, TagViewModel .. để chúng tôi có thể hiểu rõ hơn. – HichemSeeSharp
Xin lỗi @HichemC, thực sự đã đổi tên tên lớp trong khi đăng câu hỏi. Quên để thay đổi nó trong mã phía sau. Quan sát tốt mặc dù. Cảm ơn vì đã thu hút sự chú ý của tôi. – Lucifer