Tôi có điều khiển ListView
hiển thị các mục từ bộ sưu tập có thể quan sát được. Các mục này cần phải được lọc. Tôi có thể làm điều đó với CollectionViewSource
, nhưng bộ lọc cần phải được cập nhật mỗi khi một mục thay đổi.Lọc bộ sưu tập có thể quan sát
mục của tôi trông như thế này:
enum Status {Done, Failed, Skipped, ...}
class Project {
public string Name {get;set;}
public Status Status {get;set;}
// etc. etc.
}
class ProjectViewModel : INotifyPropertyChanged {
private Project project;
public ProjectBuildInfoViewModel(ProjectBuildInfo project)
{
this.project = project;
}
public string Name
{
get { return project.Name; }
set { project.Name = value; OnPropertyChanged("Name"); }
}
// etc. etc.
}
class CollectionViewModel {
private ObservableCollection<ProjectViewModel> projects =
new ObservableCollection<ProjectViewModel>();
public ObservableCollection<ProjectViewModel> Collection
{
get { return projects; }
private set {projects = value; }
}
}
Sau đó, tôi có ListView
này có ItemSource
là ràng buộc để bộ sưu tập.
// member of the user control class
private CollectionViewModel collection = new CollectionViewModel();
// in the constructor
listView.ItemSource = collection.Collection.
Điều này không lọc bất cứ điều gì. Vì vậy, tôi có các hộp kiểm tra và họ nên chỉ ra các mục (tùy thuộc vào nhà nước) nên được hiển thị. Tôi đã sử dụng sau đó một CollectionViewSource
:
private void UpdateView()
{
var source = CollectionViewSource.GetDefaultView(collection.Collection);
source.Filter = p => Filter((ProjectViewModel)p);
listStatus.ItemsSource = source;
}
Phương pháp lọc trông như thế này:
private bool Filter(ProjectViewModel project)
{
return (ckFilterDone.IsChecked.HasValue && ckFilterDone.IsChecked.Value && project.Status == Status.Done) ||
(ckFilterFailed.IsChecked.HasValue && ckFilterFailed.IsChecked.Value && project.Status == Status.Failed) ||
(ckFilterSkipped.IsChecked.HasValue && ckFilterSkipped.IsChecked.Value && project.Status == Status.Skipped);
}
này có những bất lợi mà nó còn thể hiện giá trị của các hộp kiểm, vì vậy tôi phải gọi phương pháp này (UpdateView
) mỗi khi một hộp kiểm được chọn. Nhưng nó đã có tác dụng.
Tuy nhiên, trạng thái mục sẽ thay đổi và nếu "hoàn thành" không được chọn chẳng hạn, khi một mục được "hoàn thành", nó sẽ bị xóa khỏi chế độ xem. Rõ ràng là điều đó không thay đổi trừ khi tôi lại gọi UpdateView
. Vì vậy, tôi cần phải gọi phương pháp này mỗi khi có điều gì đó thay đổi. Điều đó có vẻ xấu xí và không hiệu quả với tôi.
Vì vậy, câu hỏi của tôi là, điều này có thể được thực hiện một cách đẹp hơn không?
Tôi đã đăng một cách tiếp cận khác làm câu trả lời nhưng tôi nhớ việc thực hiện các bộ lọc hoạt động mà không cần gọi hàm Update(). Hãy thử triển khai NotifyPropertyChanged trong Project - ràng buộc không nhận thức được sự thay đổi mà không có nó. – Paparazzi