DynamicGridCheckBoxColumn.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Controls.Primitives;
  6. using System.Windows.Data;
  7. using System.Windows.Input;
  8. using System.Windows.Media;
  9. using System.Windows.Media.Imaging;
  10. using InABox.Core;
  11. using InABox.WPF;
  12. using Syncfusion.UI.Xaml.Grid;
  13. using Syncfusion.UI.Xaml.TreeGrid;
  14. namespace InABox.DynamicGrid;
  15. public class DynamicGridCheckBoxColumn<TEntity> : DynamicGridEditorColumn<TEntity, CheckBoxEditor, GridTemplateColumn, TreeGridTemplateColumn>
  16. where TEntity : BaseObject
  17. {
  18. private readonly BitmapImage ticked = Wpf.Resources.Bullet_Tick.AsBitmapImage();
  19. private readonly BitmapImage unticked = null; //Wpf.Resources.tick.AsGrayScale().AsBitmapImage();
  20. private DataTemplate CreateCellTemplate(string mapping)
  21. {
  22. return TemplateGenerator.CreateDataTemplate
  23. (
  24. () =>
  25. {
  26. var result = new Image() { Margin = new Thickness(2) };
  27. result.SetBinding(
  28. Image.SourceProperty,
  29. new Binding()
  30. {
  31. Path = new PropertyPath(mapping),
  32. Converter = new BoolToImageConverter()
  33. }
  34. );
  35. return result;
  36. }
  37. );
  38. }
  39. private DataTemplate CreateEditTemplate(string mapping)
  40. {
  41. return TemplateGenerator.CreateDataTemplate
  42. (
  43. () =>
  44. {
  45. DockPanel dock = new DockPanel();
  46. dock.Children.Add(CreateImage(mapping, ticked, Visibility.Visible, Visibility.Collapsed, BindingMode.TwoWay));
  47. dock.Children.Add(CreateImage(mapping, unticked, Visibility.Collapsed, Visibility.Visible, BindingMode.TwoWay));
  48. Border border = new Border()
  49. {
  50. Background = new SolidColorBrush(Colors.White),
  51. Child = dock
  52. };
  53. border.PreviewMouseDown += (sender, args) =>
  54. {
  55. if (sender is Border b && b.Child is DockPanel d)
  56. ToggleImages(d);
  57. args.Handled = true;
  58. };
  59. border.KeyUp += (sender, args) =>
  60. {
  61. if (args.Key == Key.Space && sender is Border b && b.Child is DockPanel d)
  62. ToggleImages(d);
  63. args.Handled = true;
  64. };
  65. return border;
  66. }
  67. );
  68. }
  69. protected override void Configure(GridTemplateColumn column, CheckBoxEditor editor)
  70. {
  71. column.CellTemplate = CreateCellTemplate(MappingName);
  72. column.EditTemplate = CreateEditTemplate(MappingName);
  73. column.SetCellBoundValue = false;
  74. }
  75. protected override void Configure(TreeGridTemplateColumn column, CheckBoxEditor editor)
  76. {
  77. column.CellTemplate = CreateCellTemplate(TreeMappingName);
  78. column.EditTemplate = CreateEditTemplate(TreeMappingName);
  79. column.SetCellBoundValue = false;
  80. }
  81. private static void ToggleImages(DockPanel d)
  82. {
  83. var t = d.Children.OfType<Image>().First();
  84. var u = d.Children.OfType<Image>().Last();
  85. t.Visibility = t.Visibility == Visibility.Visible
  86. ? Visibility.Collapsed
  87. : Visibility.Visible;
  88. u.Visibility = u.Visibility == Visibility.Visible
  89. ? Visibility.Collapsed
  90. : Visibility.Visible;
  91. }
  92. private Image CreateImage(string mapping, BitmapImage source, Visibility truevalue, Visibility falsevalue, BindingMode mode)
  93. {
  94. var image = new Image() { Source = source, Margin = new Thickness(2) };
  95. image.SetValue(DockPanel.DockProperty,Dock.Top);
  96. image.SetBinding(
  97. Image.VisibilityProperty,
  98. new Binding()
  99. {
  100. Path = new PropertyPath(mapping),
  101. Converter = new WPF.BooleanToVisibilityConverter() { TrueValue = truevalue, FalseValue = falsevalue },
  102. Mode = mode
  103. }
  104. );
  105. image.PreviewMouseDown += (sender, args) =>
  106. {
  107. if (sender is Image i)
  108. i.Visibility = i.Visibility == truevalue
  109. ? falsevalue
  110. : truevalue;
  111. args.Handled = true;
  112. };
  113. image.KeyUp += (sender, args) =>
  114. {
  115. if (args.Key == Key.Space && sender is Image i)
  116. i.Visibility = i.Visibility == truevalue
  117. ? falsevalue
  118. : truevalue;
  119. args.Handled = true;
  120. };
  121. return image;
  122. }
  123. public override bool Filtered => false;
  124. public override bool VariableWidth => false;
  125. public DynamicGridCheckBoxColumn(DynamicGridColumn definition) : base(definition)
  126. {
  127. }
  128. }