DynamicEditorControl.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using InABox.Core;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Windows;
  5. using System.Windows.Media;
  6. namespace InABox.DynamicGrid
  7. {
  8. public abstract class DynamicEditorControl<T, TEditor> : BaseDynamicEditorControl<TEditor>, IDynamicEditorControl<T>
  9. where TEditor : IBaseEditor
  10. {
  11. //{
  12. // get { return (EditorControlValueChangedHandler)GetValue(OnEditorValueChangedProperty); }
  13. // set { SetValue(OnEditorValueChangedProperty, value) }
  14. //}
  15. protected bool Updating;
  16. public DynamicEditorControl()
  17. {
  18. Loaded = false;
  19. OtherValues = new();
  20. MinHeight = 25;
  21. Focusable = false;
  22. }
  23. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  24. public override bool Changed { get; set; }
  25. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  26. public T Value
  27. {
  28. get => RetrieveValue();
  29. set => UpdateValue(value);
  30. }
  31. [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  32. protected virtual Dictionary<string, object?> OtherValues { get; }
  33. //public static readonly DependencyProperty OnEditorValueChangedProperty =
  34. // DependencyProperty.Register(nameof(OnEditorValueChanged), typeof(EditorControlValueChangedHandler), typeof(DynamicEditorControl<T>));
  35. public override event EditorControlValueChangedHandler? OnEditorValueChanged;
  36. protected void EditorValueChanged(IDynamicEditorControl sender, Dictionary<string, object?> values) => OnEditorValueChanged?.Invoke(sender, values);
  37. protected virtual bool CheckChanged()
  38. {
  39. //Logger.Send(LogType.Information, "", string.Format("{0}({1}).CheckChanged()", GetType().EntityName().Split('.').Last(), ColumnName));
  40. if (Loaded && !Updating)
  41. {
  42. Updating = true;
  43. try
  44. {
  45. var values = new Dictionary<string, object?>();
  46. var sColumn = string.IsNullOrEmpty(ColumnName) ? "" : ColumnName;
  47. values[sColumn] = RetrieveValue();
  48. foreach (var key in OtherValues.Keys)
  49. values[key] = OtherValues[key];
  50. OnEditorValueChanged?.Invoke(this, values);
  51. }
  52. finally
  53. {
  54. Changed = true;
  55. Updating = false;
  56. }
  57. }
  58. return Changed;
  59. }
  60. public override void SetValue(string property, object? value)
  61. {
  62. UpdateValue(value != null ? (T)value : default);
  63. }
  64. public override object? GetValue(string property)
  65. {
  66. return RetrieveValue();
  67. }
  68. public override Dictionary<string, object?> GetValues()
  69. {
  70. return new Dictionary<string, object?>
  71. {
  72. { ColumnName, RetrieveValue() }
  73. };
  74. }
  75. protected abstract T RetrieveValue();
  76. protected abstract void UpdateValue(T value);
  77. public override bool ShouldSerializeContent()
  78. {
  79. return false;
  80. }
  81. public override void SetEnabled(bool enabled)
  82. {
  83. if (Content is FrameworkElement element) element.IsEnabled = enabled;
  84. SetColor(enabled ? Color : Colors.WhiteSmoke);
  85. }
  86. public override void SetVisible(bool visible)
  87. {
  88. Visibility = visible ? Visibility.Visible : Visibility.Collapsed;
  89. }
  90. }
  91. }