ObservableCollectionEx.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace SKMC.Api.Common.Types
  8. {
  9. /// <summary>
  10. /// Expanded ObservableCollection to include some List<T> Methods
  11. /// </summary>
  12. [Serializable]
  13. public class ObservableCollectionEx<T> : ObservableCollection<T>
  14. {
  15. /// <summary>
  16. /// Constructors
  17. /// </summary>
  18. public ObservableCollectionEx() : base() { }
  19. public ObservableCollectionEx(List<T> l) : base(l) { }
  20. public ObservableCollectionEx(IEnumerable<T> l) : base(l) { }
  21. /// <summary>
  22. /// Sorts the items of the collection in multiply keys.
  23. /// </summary>
  24. /// <param name="sortExpressions"></param>
  25. public void Sort(params (Func<T, object> keySelector, bool ascending)[] sortExpressions)
  26. {
  27. if (sortExpressions == null || sortExpressions.Length == 0)
  28. return;
  29. // Get the sorted items as a list
  30. var sortedItems = this.ToList();
  31. IOrderedEnumerable<T> orderedEnumerable = null;
  32. for (int i = 0; i < sortExpressions.Length; i++)
  33. {
  34. var sortExpression = sortExpressions[i];
  35. if (i == 0)
  36. {
  37. orderedEnumerable = sortExpression.ascending
  38. ? sortedItems.OrderBy(sortExpression.keySelector)
  39. : sortedItems.OrderByDescending(sortExpression.keySelector);
  40. }
  41. else
  42. {
  43. orderedEnumerable = sortExpression.ascending
  44. ? orderedEnumerable.ThenBy(sortExpression.keySelector)
  45. : orderedEnumerable.ThenByDescending(sortExpression.keySelector);
  46. }
  47. }
  48. sortedItems = orderedEnumerable.ToList();
  49. // Reorder the collection using Move
  50. for (int i = 0; i < sortedItems.Count; i++)
  51. {
  52. var item = sortedItems[i];
  53. var currentIndex = IndexOf(item);
  54. if (currentIndex != i)
  55. {
  56. Move(currentIndex, i);
  57. }
  58. }
  59. }
  60. }
  61. }