using System; using System.Net; using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Data; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Windows.Controls; using System.ComponentModel; namespace MyProject.MyLogic.ViewModel { public class MyViewModel : INotifyPropertyChanged { public MyViewModel() { FilteredList.Filter += new FilterEventHandler(OnFilteredListChange); FilteredList.Source = HumanResources; } private ObservableCollection<MyCustomClass> _fullList = new ObservableCollection<MyCustomClass>(); public ObservableCollection<MyCustomClass> FullList { get { return _fullList; } set { _fullList = value; OnPropertiesChanged("FullList"); } } private CollectionViewSource _filteredList = new CollectionViewSource(); public CollectionViewSource FilteredList { get { return _filteredList; } set { _filteredList = value; } } private void OnFilteredListChange(object sender, FilterEventArgs e) { if (e.Item != null) { var item = e.Item as MyCustomClass; e.Accepted = (item.IsVisible); } } private void OnListFiltered() // Call this method after any change to the FullList collection or after filtering is done. { filteredList.View.Refresh(); } public void LoadFullList() { try { _fullList.Clear(); var list = GetMyListOfCustomClasses(); if (list == null) return; foreach (var item in list) { item.IsVisible = true; _fullList.Add(item); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } finally { OnListFiltered(); } } public void Filter(string description) { try { // write logic to set the .IsVisible property of the custom class. } finally { OnListFiltered(); } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { if (PropertyChanged == null) { return; } PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }