DynamicSelectorGrid.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using InABox.Core;
  2. using InABox.WPF;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows.Controls;
  9. using System.Windows.Media.Imaging;
  10. namespace InABox.DynamicGrid;
  11. public class DynamicSelectorGrid<T> : DynamicDataGrid<T>
  12. where T : Entity, IRemotable, IPersistent, new()
  13. {
  14. private static BitmapImage tick = InABox.Wpf.Resources.tick.AsBitmapImage();
  15. public HashSet<Guid> SelectedIDs { get; set; } = new();
  16. public delegate void SelectionChangedEvent(HashSet<Guid> selected);
  17. public event SelectionChangedEvent? SelectionChanged;
  18. public DynamicSelectorGrid(DynamicActionColumnPosition tickPosition)
  19. {
  20. ActionColumns.Add(new DynamicImageColumn(Selected_Image, Selected_Click)
  21. {
  22. Position = tickPosition
  23. });
  24. }
  25. private BitmapImage? Selected_Image(CoreRow? row)
  26. {
  27. if (row is null) return tick;
  28. return SelectedIDs.Contains(row.Get<T, Guid>(x => x.ID)) ? tick : null;
  29. }
  30. private bool Selected_Click(CoreRow? row)
  31. {
  32. if (row is null)
  33. {
  34. var menu = new ContextMenu();
  35. menu.AddItem("Select All", null, SelectAll_Click);
  36. menu.AddItem("Deselect All", null, DeselectAll_Click);
  37. menu.IsOpen = true;
  38. return false;
  39. }
  40. var id = row.Get<T, Guid>(x => x.ID);
  41. if (SelectedIDs.Contains(id))
  42. {
  43. SelectedIDs.Remove(id);
  44. }
  45. else
  46. {
  47. SelectedIDs.Add(id);
  48. }
  49. SelectionChanged?.Invoke(SelectedIDs);
  50. InvalidateRow(row);
  51. return false;
  52. }
  53. private void DeselectAll_Click()
  54. {
  55. SelectedIDs.Clear();
  56. SelectionChanged?.Invoke(SelectedIDs);
  57. InvalidateGrid();
  58. }
  59. private void SelectAll_Click()
  60. {
  61. SelectedIDs = Data.Rows.Select(x => x.Get<T, Guid>(x => x.ID)).ToHashSet();
  62. SelectionChanged?.Invoke(SelectedIDs);
  63. InvalidateGrid();
  64. }
  65. protected override void DoReconfigure(FluentList<DynamicGridOption> options)
  66. {
  67. base.DoReconfigure(options);
  68. options.Clear();
  69. }
  70. }