DynamicGridEditorColumn.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Windows;
  5. using System.Windows.Data;
  6. using InABox.Core;
  7. using NPOI.OpenXmlFormats.Wordprocessing;
  8. using Syncfusion.UI.Xaml.Grid;
  9. namespace InABox.DynamicGrid;
  10. public abstract class DynamicGridEditorColumn<TEntity, TEditor, TColumn> : IDynamicGridEditorColumn
  11. where TEntity : BaseObject
  12. where TEditor : class
  13. where TColumn : GridColumn, new()
  14. {
  15. public TColumn Column { get; }
  16. public List<string> ExtraColumns { get; } = new();
  17. GridColumn IDynamicGridEditorColumn.Column => this.Column;
  18. public string? MappingName => _definition?.ColumnName.Replace('.', '_');
  19. public Func<BaseObject>? GetEntity { get; set; }
  20. public void DoEntityChanged(string columnname, Dictionary<string,object?> changes)
  21. {
  22. EntityChanged?.Invoke(this, new DynamicColumnEntityChangedEventArgs(columnname, changes));
  23. }
  24. public event DynamicColumnEntityChangedEvent EntityChanged;
  25. protected void UpdateData(Dictionary<string, object> updates)
  26. {
  27. var entity = GetEntity?.Invoke();
  28. if (entity != null)
  29. {
  30. var changes = new Dictionary<string, object?>();
  31. foreach (var key in updates.Keys)
  32. DynamicGridUtils.UpdateEditorValue(new BaseObject[] { entity }, key, updates[key], changes);
  33. EntityChanged?.Invoke(this, new DynamicColumnEntityChangedEventArgs(Definition.ColumnName, changes));
  34. }
  35. }
  36. protected DynamicGridEditorColumn(DynamicGridColumn definition)
  37. {
  38. Column = new TColumn()
  39. {
  40. UpdateTrigger = UpdateSourceTrigger.PropertyChanged
  41. };
  42. Definition = definition;
  43. }
  44. private DynamicGridColumn? _definition;
  45. public DynamicGridColumn? Definition
  46. {
  47. get => _definition;
  48. set
  49. {
  50. _definition = value;
  51. UpdateBinding(Column);
  52. if (Editor != null)
  53. DoConfigure(Column, Editor);
  54. }
  55. }
  56. public virtual GridSummaryColumn? Summary() => null;
  57. public TEditor? Editor
  58. {
  59. get
  60. {
  61. if (Definition != null)
  62. {
  63. var result = Definition?.Editor as TEditor;
  64. if (result == null)
  65. result = CoreUtils.GetProperty<TEntity>(Definition.ColumnName)?.GetEditor() as TEditor;
  66. return result;
  67. }
  68. return null;
  69. }
  70. }
  71. protected virtual void UpdateBinding(TColumn column)
  72. {
  73. column.MappingName = MappingName;
  74. }
  75. protected TextAlignment GetTextAlignment(TEditor editor) => Definition?.Alignment == Alignment.NotSet
  76. ? editor is NumericEditor ? TextAlignment.Right : TextAlignment.Left
  77. : Definition?.Alignment == Alignment.BottomLeft ||
  78. Definition?.Alignment == Alignment.MiddleLeft ||
  79. Definition?.Alignment == Alignment.TopLeft
  80. ? TextAlignment.Left
  81. : Definition?.Alignment == Alignment.BottomCenter ||
  82. Definition?.Alignment == Alignment.MiddleCenter ||
  83. Definition?.Alignment == Alignment.TopCenter
  84. ? TextAlignment.Center
  85. : TextAlignment.Right;
  86. private void DoConfigure(TColumn column, TEditor editor)
  87. {
  88. Configure(column,editor);
  89. // Post-Configure the column - refactor from DynamicGrid.ReloadColumns()
  90. Column.Width = column.Width; // != 0 ? column.Width : double.NaN;
  91. Column.ColumnSizer =
  92. GridLengthUnitType
  93. .None; //column.Width != 0 ? GridLengthUnitType.None : GridLengthUnitType.AutoWithLastColumnFill;
  94. Column.HeaderText = string.IsNullOrWhiteSpace(Definition?.Caption)
  95. ? Definition?.ColumnName
  96. : Definition.Caption;
  97. Column.TextAlignment = GetTextAlignment(editor);
  98. Column.HorizontalHeaderContentAlignment = Column.TextAlignment == TextAlignment.Left
  99. ? HorizontalAlignment.Left
  100. : Column.TextAlignment == TextAlignment.Center
  101. ? HorizontalAlignment.Center
  102. : HorizontalAlignment.Right;
  103. }
  104. protected abstract void Configure(TColumn column, TEditor editor);
  105. public virtual bool VariableWidth => true;
  106. public virtual bool VariableHeight => false;
  107. public virtual bool Filtered => true;
  108. public virtual bool Editable => Definition?.Editor.Editable == InABox.Core.Editable.Enabled;
  109. }