DynamicGridCheckBoxColumn.cs 4.8 KB

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