मेरे पास ListView
नियंत्रण है जो एक अवलोकन संग्रह से आइटम प्रदर्शित करता है। इन वस्तुओं को फ़िल्टर करने की जरूरत है। मैं इसे CollectionViewSource
के साथ करने में सक्षम हूं, लेकिन जब भी कोई आइटम बदलता है तो फ़िल्टर को अद्यतन करने की आवश्यकता होती है।एक अवलोकन संग्रह फ़िल्टर करें
मेरे कपड़े इस तरह दिखता है:
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; }
}
}
तब मैं इस ListView
जिसका ItemSource
संग्रह करने के लिए बाध्य कर रहा है।
// member of the user control class
private CollectionViewModel collection = new CollectionViewModel();
// in the constructor
listView.ItemSource = collection.Collection.
यह कुछ भी फ़िल्टर नहीं करता है। तो मेरे पास ये चेक बॉक्स हैं और उन्हें इंगित करना चाहिए कि कौन से आइटम (राज्य के आधार पर) प्रदर्शित किए जाने चाहिए। मैं तो एक CollectionViewSource
का इस्तेमाल किया है:
private void UpdateView()
{
var source = CollectionViewSource.GetDefaultView(collection.Collection);
source.Filter = p => Filter((ProjectViewModel)p);
listStatus.ItemsSource = source;
}
फिल्टर विधि इस तरह दिखता है: मैं इस विधि कॉल करने के लिए है
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);
}
इस नुकसान यह है कि यह चेक बॉक्स के मूल्यों को दर्शाता है, तो (UpdateView
) हर बार एक चेकबॉक्स की जांच की जाती है। लेकिन यह काम करता है।
हालांकि, आइटम स्थिति बदलती है और उदाहरण के लिए "किया गया" चेक नहीं किया जाता है, जब कोई आइटम "किया जाता है" में इसे दृश्य से हटा दिया जाना चाहिए। जाहिर है कि जब तक मैं फिर से UpdateView
पर कॉल नहीं करता तब तक यह नहीं बदलेगा। तो मुझे प्रत्येक बार कुछ बदलावों को बदलने के लिए इस विधि को कॉल करने की आवश्यकता है। यह बदसूरत और अक्षम है मुझे लगता है।
तो मेरा सवाल यह है कि, क्या यह एक अच्छे तरीके से किया जा सकता है?
मैंने एक उत्तर के रूप में एक और दृष्टिकोण पोस्ट किया लेकिन मुझे याद है कि फ़िल्टर को अपडेट() के बिना कॉल किए बिना काम करना है। परियोजना में परिवर्तन किए गए NotifyProperty को लागू करने का प्रयास करें - बाध्यकारी इसके बिना किसी बदलाव के बारे में पता नहीं है। – Paparazzi