From 8e3e94fdc8f59acfbc8ae58c0f7c19bce979064f Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Wed, 4 Jun 2025 14:15:20 +0800 Subject: [PATCH] Add DataGridFilterDescription --- .../Column/DataGridColumn.Privates.cs | 1 - .../Column/DataGridColumn.cs | 44 ++++++++++++------- .../Data/DataGridDataConnection.cs | 2 +- .../Data/DataGridFilterDescription.cs | 5 ++- .../Data/DataGridSortDescription.cs | 2 +- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs index 8bbeb46fa..f0bb5416e 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs @@ -20,7 +20,6 @@ namespace AtomUI.Controls; public abstract partial class DataGridColumn : IDataGridColumnGroupItem { #region 常量定义 - internal const bool DefaultIsReadOnly = false; #endregion diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs index 8d9a80c0f..c1f44ca3f 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs @@ -3,6 +3,8 @@ // Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details. // All other rights reserved. +using System.Collections; +using System.Collections.ObjectModel; using System.ComponentModel; using AtomUI.Controls.Utils; using AtomUI.Utils; @@ -76,6 +78,7 @@ public abstract partial class DataGridColumn : AvaloniaObject public static readonly StyledProperty VerticalAlignmentProperty = Layoutable.VerticalAlignmentProperty.AddOwner(); + /// /// Determines whether or not this column is visible. /// @@ -374,11 +377,7 @@ public abstract partial class DataGridColumn : AvaloniaObject /// /// The binding that will be used to get or set cell content for the clipboard. /// - public virtual IBinding? ClipboardContentBinding - { - get => _clipboardContentBinding; - set => _clipboardContentBinding = value; - } + public virtual IBinding? ClipboardContentBinding { get; set; } /// /// Holds the name of the member to use for sorting, if not using the default. @@ -393,7 +392,27 @@ public abstract partial class DataGridColumn : AvaloniaObject /// /// Holds a Comparer to use for sorting, if not using the default. /// - public System.Collections.IComparer? CustomSortComparer { get; set; } + public IComparer? CustomSortComparer { get; set; } + + /// + /// Filter menu config + /// + public ObservableCollection Filters { get; } = new(); + + /// + /// Custom filter, the first parameter is the filter condition, the second parameter is the data record + /// + public Func OnFilter { get; set; } + + /// + /// Whether multiple filters can be selected + /// + public DataGridFilterMode FilterMode { get; set; } + + /// + /// Whether to trigger filter when the filter menu closes + /// + public bool FilterOnClose { get; set; } public virtual bool IsReadOnly { @@ -419,17 +438,9 @@ public abstract partial class DataGridColumn : AvaloniaObject } } - public bool IsAutoGenerated - { - get; - internal set; - } + public bool IsAutoGenerated { get; internal set; } - public bool IsFrozen - { - get; - internal set; - } + public bool IsFrozen { get; internal set; } #endregion @@ -468,6 +479,7 @@ public abstract partial class DataGridColumn : AvaloniaObject _displayIndexWithFiller = -1; IsInitialDesiredWidthDetermined = false; InheritsWidth = true; + OnFilter = (value, record) => true; } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) diff --git a/src/AtomUI.Controls.DataGrid/Data/DataGridDataConnection.cs b/src/AtomUI.Controls.DataGrid/Data/DataGridDataConnection.cs index 4aa8d624c..73e966a4d 100644 --- a/src/AtomUI.Controls.DataGrid/Data/DataGridDataConnection.cs +++ b/src/AtomUI.Controls.DataGrid/Data/DataGridDataConnection.cs @@ -112,7 +112,7 @@ internal class DataGridDataConnection { if (dataType != null) { - Type type = TypeHelper.GetNonNullableType(dataType); // no-opt if dataType isn't nullable + var type = dataType.GetNonNullableType(); // no-opt if dataType isn't nullable return type.IsPrimitive || type == typeof(string) || type == typeof(DateTime) || type == typeof(Decimal); } return false; diff --git a/src/AtomUI.Controls.DataGrid/Data/DataGridFilterDescription.cs b/src/AtomUI.Controls.DataGrid/Data/DataGridFilterDescription.cs index 2df1f2197..26c66e160 100644 --- a/src/AtomUI.Controls.DataGrid/Data/DataGridFilterDescription.cs +++ b/src/AtomUI.Controls.DataGrid/Data/DataGridFilterDescription.cs @@ -2,5 +2,8 @@ namespace AtomUI.Controls.Data; public class DataGridFilterDescription { - + public bool IsEnabled { get; set; } + public int ColumnIndex { get; set; } + public List? FilterConditions { get; set; } + public Func? OnFilter { get; set; } } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Data/DataGridSortDescription.cs b/src/AtomUI.Controls.DataGrid/Data/DataGridSortDescription.cs index 706c052af..1e0994c8e 100644 --- a/src/AtomUI.Controls.DataGrid/Data/DataGridSortDescription.cs +++ b/src/AtomUI.Controls.DataGrid/Data/DataGridSortDescription.cs @@ -338,8 +338,8 @@ public class DataGridComparerSortDescription : DataGridSortDescription } return result; - } + public override DataGridSortDescription SwitchSortDirection() { var newDirection = _direction == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;