ModelView.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #region (c) 2019 Gilles Macabies All right reserved
  2. // Author : Gilles Macabies
  3. // Solution : DataGridFilter
  4. // Projet : DataGridFilter
  5. // File : ModelView.cs
  6. // Created : 31/10/2019
  7. #endregion (c) 2019 Gilles Macabies All right reserved
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Collections.ObjectModel;
  11. using System.ComponentModel;
  12. using System.Linq;
  13. using System.Windows.Data;
  14. using System.Windows.Input;
  15. // ReSharper disable MemberCanBePrivate.Global
  16. namespace DemoApplication.ModelView
  17. {
  18. public class ModelView : INotifyPropertyChanged
  19. {
  20. #region Public Constructors
  21. public ModelView()
  22. {
  23. FillData();
  24. }
  25. #endregion Public Constructors
  26. #region Command
  27. /// <summary>
  28. /// Refresh all
  29. /// </summary>
  30. public ICommand RefreshCommand => new DelegateCommand(RefreshData);
  31. #endregion Command
  32. #region Private Fields
  33. private ICollectionView collView;
  34. private string search;
  35. #endregion Private Fields
  36. #region Public Properties
  37. public ObservableCollection<Employe> Employes { get; set; }
  38. public ObservableCollection<Employe> FilteredList { get; set; }
  39. /// <summary>
  40. /// Global filter
  41. /// </summary>
  42. public string Search
  43. {
  44. get => search;
  45. set
  46. {
  47. search = value;
  48. collView.Filter = e =>
  49. {
  50. var item = (Employe)e;
  51. return item != null && ((item.LastName?.StartsWith(search, StringComparison.OrdinalIgnoreCase) ?? false)
  52. || (item.FirstName?.StartsWith(search, StringComparison.OrdinalIgnoreCase) ?? false));
  53. };
  54. collView.Refresh();
  55. FilteredList = new ObservableCollection<Employe>(collView.OfType<Employe>().ToList());
  56. OnPropertyChanged("Search");
  57. OnPropertyChanged("FilteredList");
  58. }
  59. }
  60. #endregion Public Properties
  61. #region Public Events
  62. public event PropertyChangedEventHandler PropertyChanged;
  63. #endregion Public Events
  64. #region Private Methods
  65. /// <summary>
  66. /// Fill data
  67. /// </summary>
  68. private void FillData()
  69. {
  70. search = "";
  71. var employe = new List<Employe>();
  72. // number of elements to be generated
  73. const int @int = 100000;
  74. // for distinct lastname set "true" at CreateRandomEmployee(true)
  75. for (var i = 0; i < @int; i++)
  76. employe.Add(RandomGenerator.CreateRandomEmployee(true));
  77. Employes = new ObservableCollection<Employe>(employe.AsParallel().OrderBy(o => o.LastName));
  78. FilteredList = new ObservableCollection<Employe>(Employes);
  79. collView = CollectionViewSource.GetDefaultView(FilteredList);
  80. OnPropertyChanged("Search");
  81. OnPropertyChanged("Employes");
  82. OnPropertyChanged("FilteredList");
  83. }
  84. private void OnPropertyChanged(string propertyname)
  85. {
  86. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
  87. }
  88. /// <summary>
  89. /// refresh data
  90. /// </summary>
  91. /// <param name="obj"></param>
  92. private void RefreshData(object obj)
  93. {
  94. FillData();
  95. }
  96. #endregion Private Methods
  97. }
  98. }