DynamicGridCheckBoxColumn.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. namespace InABox.DynamicGrid;
  15. public class DynamicGridCheckBoxColumn<TEntity> : DynamicGridEditorColumn<TEntity,CheckBoxEditor,GridTemplateColumn>
  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. protected override void Configure(GridTemplateColumn column, CheckBoxEditor editor)
  21. {
  22. column.CellTemplate = 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(MappingName),
  32. Converter = new BoolToImageConverter()
  33. }
  34. );
  35. return result;
  36. }
  37. );
  38. column.EditTemplate = TemplateGenerator.CreateDataTemplate
  39. (
  40. () =>
  41. {
  42. DockPanel dock = new DockPanel();
  43. dock.Children.Add(CreateImage(ticked, Visibility.Visible, Visibility.Collapsed, BindingMode.TwoWay));
  44. dock.Children.Add(CreateImage(unticked, Visibility.Collapsed, Visibility.Visible, BindingMode.TwoWay));
  45. Border border = new Border()
  46. {
  47. Background = new SolidColorBrush(Colors.White),
  48. Child = dock
  49. };
  50. border.PreviewMouseDown += (sender, args) =>
  51. {
  52. if (sender is Border b && b.Child is DockPanel d)
  53. ToggleImages(d);
  54. args.Handled = true;
  55. };
  56. border.KeyUp += (sender, args) =>
  57. {
  58. if (args.Key == Key.Space && sender is Border b && b.Child is DockPanel d)
  59. ToggleImages(d);
  60. args.Handled = true;
  61. };
  62. return border;
  63. }
  64. );
  65. column.SetCellBoundValue = false;
  66. }
  67. private static void ToggleImages(DockPanel d)
  68. {
  69. var t = d.Children.OfType<Image>().First();
  70. var u = d.Children.OfType<Image>().Last();
  71. t.Visibility = t.Visibility == Visibility.Visible
  72. ? Visibility.Collapsed
  73. : Visibility.Visible;
  74. u.Visibility = u.Visibility == Visibility.Visible
  75. ? Visibility.Collapsed
  76. : Visibility.Visible;
  77. }
  78. private Image CreateImage(BitmapImage source, Visibility truevalue, Visibility falsevalue, BindingMode mode)
  79. {
  80. var image = new Image() { Source = source, Margin = new Thickness(2) };
  81. image.SetValue(DockPanel.DockProperty,Dock.Top);
  82. image.SetBinding(
  83. Image.VisibilityProperty,
  84. new Binding()
  85. {
  86. Path = new PropertyPath(MappingName),
  87. Converter = new BoolToVisibilityConverter() { TrueValue = truevalue, FalseValue = falsevalue },
  88. Mode = mode
  89. }
  90. );
  91. image.PreviewMouseDown += (sender, args) =>
  92. {
  93. if (sender is Image i)
  94. i.Visibility = i.Visibility == truevalue
  95. ? falsevalue
  96. : truevalue;
  97. args.Handled = true;
  98. };
  99. image.KeyUp += (sender, args) =>
  100. {
  101. if (args.Key == Key.Space && sender is Image i)
  102. i.Visibility = i.Visibility == truevalue
  103. ? falsevalue
  104. : truevalue;
  105. args.Handled = true;
  106. };
  107. return image;
  108. }
  109. public override bool Filtered => false;
  110. public override bool VariableWidth => false;
  111. public DynamicGridCheckBoxColumn(DynamicGridColumn definition) : base(definition)
  112. {
  113. }
  114. }