DynamicGridCheckBoxColumn.cs 4.8 KB

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