#region (c) 2019 Gilles Macabies All right reserved // Author : Gilles Macabies // Solution : DataGridFilter // Projet : DataGridFilter // File : ModelView.cs // Created : 31/10/2019 #endregion (c) 2019 Gilles Macabies All right reserved using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Windows.Data; using System.Windows.Input; // ReSharper disable MemberCanBePrivate.Global namespace DemoApplication.ModelView { public class ModelView : INotifyPropertyChanged { #region Public Constructors public ModelView() { FillData(); } #endregion Public Constructors #region Command /// /// Refresh all /// public ICommand RefreshCommand => new DelegateCommand(RefreshData); #endregion Command #region Private Fields private ICollectionView collView; private string search; #endregion Private Fields #region Public Properties public ObservableCollection Employes { get; set; } public ObservableCollection FilteredList { get; set; } /// /// Global filter /// public string Search { get => search; set { search = value; collView.Filter = e => { var item = (Employe)e; return item != null && ((item.LastName?.StartsWith(search, StringComparison.OrdinalIgnoreCase) ?? false) || (item.FirstName?.StartsWith(search, StringComparison.OrdinalIgnoreCase) ?? false)); }; collView.Refresh(); FilteredList = new ObservableCollection(collView.OfType().ToList()); OnPropertyChanged("Search"); OnPropertyChanged("FilteredList"); } } #endregion Public Properties #region Public Events public event PropertyChangedEventHandler PropertyChanged; #endregion Public Events #region Private Methods /// /// Fill data /// private void FillData() { search = ""; var employe = new List(); // number of elements to be generated const int @int = 100000; // for distinct lastname set "true" at CreateRandomEmployee(true) for (var i = 0; i < @int; i++) employe.Add(RandomGenerator.CreateRandomEmployee(true)); Employes = new ObservableCollection(employe.AsParallel().OrderBy(o => o.LastName)); FilteredList = new ObservableCollection(Employes); collView = CollectionViewSource.GetDefaultView(FilteredList); OnPropertyChanged("Search"); OnPropertyChanged("Employes"); OnPropertyChanged("FilteredList"); } private void OnPropertyChanged(string propertyname) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname)); } /// /// refresh data /// /// private void RefreshData(object obj) { FillData(); } #endregion Private Methods } }