소스 검색

Added DynamicGrid.GetColumnFilterItems; fixed soem dynamic grid problems

Kenric Nugteren 1 년 전
부모
커밋
3246865ad6

+ 8 - 1
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -538,6 +538,13 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         
     }
 
+    IEnumerable<string>? IDynamicGridUIComponentParent<T>.GetColumnFilterItems(DynamicColumnBase column) => GetColumnFilterItems(column);
+
+    protected virtual IEnumerable<string>? GetColumnFilterItems(DynamicColumnBase column)
+    {
+        return null;
+    }
+
     #endregion
 
     protected virtual DynamicGridRowStyleSelector<T> GetRowStyleSelector()
@@ -981,7 +988,7 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
     {
         var bOK = ActionColumns.All(x =>
         {
-            return x.FilterRecord is null || x.SelectedFilters is null || !x.SelectedFilters.Any()
+            return x.FilterRecord is null || x.SelectedFilters is null || x.SelectedFilters.Length == 0
                 || x.FilterRecord.Invoke(row, x.SelectedFilters);
         });
         if (bOK && OnFilterRecord is not null)

+ 56 - 13
inabox.wpf/DynamicGrid/UIComponent/DynamicGridGridUIComponent.cs

@@ -65,7 +65,7 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
 
     #endregion
 
-    private readonly SfDataGrid DataGrid;
+    protected readonly SfDataGrid DataGrid;
 
     private readonly ContextMenu ColumnsMenu;
 
@@ -373,7 +373,7 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
         var columnindex = DataGrid.ResolveToGridVisibleColumnIndex(rowcolumnindex.ColumnIndex);
 
         // Header Click Here!
-        if (rowcolumnindex.RowIndex == 0)
+        if (rowcolumnindex.RowIndex < DataGrid.StackedHeaderRows.Count + 1)
         {
 
             var column = GetColumn(columnindex);
@@ -570,10 +570,36 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
 
     private void DataGrid_FilterItemsPopulating(object? sender, GridFilterItemsPopulatingEventArgs e)
     {
-        var col = DataGrid.Columns.IndexOf(e.Column);
-        if (GetColumn(col) is DynamicActionColumn column && column.Filters is not null)
-            e.ItemsSource = column.Filters.Select(x => new FilterElement
-            { DisplayText = x, ActualValue = x, IsSelected = column.SelectedFilters is null || column.SelectedFilters.Contains(x) });
+        var colIdx = DataGrid.Columns.IndexOf(e.Column);
+        var column = GetColumn(colIdx);
+        if(column is not null)
+        {
+            var filterItems = Parent.GetColumnFilterItems(column);
+            if(filterItems is not null)
+            {
+                e.ItemsSource = filterItems.Select(x =>
+                {
+                    var element = new FilterElement
+                    {
+                        DisplayText = x,
+                        ActualValue = x,
+                    };
+                    if(column is DynamicActionColumn dac)
+                    {
+                        element.IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x);
+                    }
+                    return element;
+                });
+            }
+            else if (column is DynamicActionColumn dac && dac.Filters is not null)
+            {
+                e.ItemsSource = dac.Filters.Select(x => new FilterElement {
+                    DisplayText = x,
+                    ActualValue = x,
+                    IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x)
+                });
+            }
+        }
     }
 
     private void DataGrid_CellToolTipOpening(object? sender, GridCellToolTipOpeningEventArgs e)
@@ -618,6 +644,10 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     list.Add(new(gridColumn.ColumnName, rowPredicate));
                 }
             }
+            else if(col is DynamicActionColumn dac && dac.FilterRecord is not null && dac.SelectedFilters is not null && dac.SelectedFilters.Length > 0)
+            {
+                list.Add(new(column.MappingName, (row) => dac.FilterRecord(row, dac.SelectedFilters)));
+            }
         }
         return list;
     }
@@ -829,7 +859,7 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     newcol.Width = column.Width;
                     newcol.ColumnSizer = GridLengthUnitType.None;
                     newcol.HeaderText = column.HeaderText;
-                    newcol.AllowFiltering = column.Filters != null && column.Filters.Any();
+                    newcol.AllowFiltering = column.Filters != null && column.Filters.Length != 0;
                     newcol.AllowSorting = false;
                     newcol.FilterRowOptionsVisibility = Visibility.Collapsed;
                     newcol.ShowHeaderToolTip = column.ToolTip != null;
@@ -926,21 +956,34 @@ public class DynamicGridGridUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     cellstyle.Setters.Add(new Setter(Control.BackgroundProperty,
                         new Binding()
                         {
-                            Path = new PropertyPath("."), Converter = CellBackgroundConverter,
-                            ConverterParameter = column
+                            Path = new PropertyPath("."),
+                            Converter = CellBackgroundConverter,
+                            ConverterParameter = new DynamicGridCellStyleParameters(column,DependencyProperty.UnsetValue)
                         }));
                     cellstyle.Setters.Add(new Setter(Control.ForegroundProperty,
                         new Binding()
-                            { Converter = CellForegroundConverter, ConverterParameter = column }));
+                        {
+                            Converter = CellForegroundConverter,
+                            ConverterParameter = new DynamicGridCellStyleParameters(column,DependencyProperty.UnsetValue)
+                        }));
                     cellstyle.Setters.Add(new Setter(Control.FontSizeProperty,
                         new Binding()
-                            { Converter = CellFontSizeConverter, ConverterParameter = column }));
+                        {
+                            Converter = CellFontSizeConverter,
+                            ConverterParameter = new DynamicGridCellStyleParameters(column,DependencyProperty.UnsetValue)
+                        }));
                     cellstyle.Setters.Add(new Setter(Control.FontStyleProperty,
                         new Binding()
-                            { Converter = CellFontStyleConverter, ConverterParameter = column }));
+                        {
+                            Converter = CellFontStyleConverter,
+                            ConverterParameter = new DynamicGridCellStyleParameters(column,DependencyProperty.UnsetValue)
+                        }));
                     cellstyle.Setters.Add(new Setter(Control.FontWeightProperty,
                         new Binding()
-                            { Converter = CellFontWeightConverter, ConverterParameter = column }));
+                        {
+                            Converter = CellFontWeightConverter,
+                            ConverterParameter = new DynamicGridCellStyleParameters(column,DependencyProperty.UnsetValue)
+                        }));
                     newcol.CellStyle = cellstyle;
 
                     DataGrid.Columns.Add(newcol);

+ 30 - 14
inabox.wpf/DynamicGrid/UIComponent/DynamicGridTreeUIComponent.cs

@@ -385,22 +385,34 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
 
     private void _tree_FilterItemsPopulating(object? sender, Syncfusion.UI.Xaml.TreeGrid.Filtering.TreeGridFilterItemsPopulatingEventArgs e)
     {
-        var col = _tree.Columns.IndexOf(e.Column);
-        if (GetColumn(col) is DynamicActionColumn dac && dac.Filters is not null)
+        var colIdx = _tree.Columns.IndexOf(e.Column);
+        var column = GetColumn(colIdx);
+        if(column is not null)
         {
-            e.ItemsSource = dac.Filters.Select(x => new FilterElement
+            var filterItems = Parent.GetColumnFilterItems(column);
+            if(filterItems is not null)
             {
-                DisplayText = x, ActualValue = x,
-                IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x)
-            });
-        }
-        else if (GetColumn(col) is DynamicGridColumn dgc)
-        {
-            var preds = e.Column.FilterPredicates.Select(x => x.FilterValue).ToArray();
-            var data = Parent.Data.Rows.Select(r => r.Get<String>(dgc.ColumnName)).OrderBy(x=>x);
-            
-            e.ItemsSource = data.Select(x => new FilterElement()
-                { DisplayText = x ?? "(Blanks)", ActualValue = x,  IsSelected = !preds.Any() || preds.Contains(x) });
+                e.ItemsSource = filterItems.Select(x => new FilterElement
+                {
+                    DisplayText = x, ActualValue = x
+                });
+            }
+            else if (column is DynamicActionColumn dac && dac.Filters is not null)
+            {
+                e.ItemsSource = dac.Filters.Select(x => new FilterElement
+                {
+                    DisplayText = x, ActualValue = x,
+                    IsSelected = dac.SelectedFilters is null || dac.SelectedFilters.Contains(x)
+                });
+            }
+            else if (column is DynamicGridColumn dgc)
+            {
+                var preds = e.Column.FilterPredicates.Select(x => x.FilterValue).ToArray();
+                var data = Parent.Data.Rows.Select(r => r.Get<String>(dgc.ColumnName)).OrderBy(x=>x);
+                
+                e.ItemsSource = data.Select(x => new FilterElement()
+                    { DisplayText = x ?? "(Blanks)", ActualValue = x,  IsSelected = preds.Length == 0 || preds.Contains(x) });
+            }
         }
     }
 
@@ -1111,6 +1123,10 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     list.Add(new(gridColumn.ColumnName, rowPredicate));
                 }
             }
+            else if(col is DynamicActionColumn dac && dac.FilterRecord is not null && dac.SelectedFilters is not null && dac.SelectedFilters.Length > 0)
+            {
+                list.Add(new(column.MappingName, (row) => dac.FilterRecord(row, dac.SelectedFilters)));
+            }
         }
         return list;
     }

+ 1 - 0
inabox.wpf/DynamicGrid/UIComponent/IDynamicGridUIComponent.cs

@@ -44,6 +44,7 @@ public interface IDynamicGridUIComponentParent<T> : IDynamicGrid<T>
     void DragStart(object? sender, CoreRow[] rows);
 
     void UIFilterChanged(object sender);
+    IEnumerable<string>? GetColumnFilterItems(DynamicColumnBase column);
 }
 
 public interface IDynamicGridUIComponent<T>