diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs
index f0bb5416e..97557145d 100644
--- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs
+++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.Privates.cs
@@ -29,6 +29,7 @@ public abstract partial class DataGridColumn : IDataGridColumnGroupItem
internal bool? CanUserReorderInternal { get; set; }
internal bool? CanUserResizeInternal { get; set; }
internal bool? CanUserSortInternal { get; set; }
+ internal bool? CanUserFilterInternal { get; set; }
internal bool ActualCanUserResize
{
diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs
index c1f44ca3f..f357ae649 100644
--- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs
+++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs
@@ -246,6 +246,21 @@ public abstract partial class DataGridColumn : AvaloniaObject
}
}
+ public bool CanUserFilter
+ {
+ get => CanUserResizeInternal ??
+ OwningGrid?.CanUserResizeColumns ??
+ DataGrid.DefaultCanUserResizeColumns;
+ set
+ {
+ CanUserFilterInternal = value;
+ if (HasHeaderCell)
+ {
+ HeaderCell.CanUserFilter = value;
+ }
+ }
+ }
+
///
/// Gets or sets a value that indicates whether the user can sort the column by clicking the column header.
///
diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs
index 9eadf388e..bf660f2b1 100644
--- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs
+++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs
@@ -94,6 +94,12 @@ internal class DataGridColumnHeader : ContentControl
o => o.CanUserSort,
(o, v) => o.CanUserSort = v);
+ internal static readonly DirectProperty CanUserFilterProperty =
+ AvaloniaProperty.RegisterDirect(
+ nameof(CanUserFilter),
+ o => o.CanUserFilter,
+ (o, v) => o.CanUserFilter = v);
+
internal static readonly DirectProperty CurrentSortingStateProperty =
AvaloniaProperty.RegisterDirect(
nameof(CurrentSortingState),
@@ -162,6 +168,13 @@ internal class DataGridColumnHeader : ContentControl
set => SetValue(SupportedDirectionsProperty, value);
}
+ private bool _canUserFilter = false;
+ internal bool CanUserFilter
+ {
+ get => _canUserFilter;
+ set => SetAndRaise(CanUserFilterProperty, ref _canUserFilter, value);
+ }
+
internal DataGridColumn? OwningColumn { get; set; }
internal DataGrid? OwningGrid => OwningColumn?.OwningGrid;
diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridFilterIndicator.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs
similarity index 53%
rename from src/AtomUI.Controls.DataGrid/Column/DataGridFilterIndicator.cs
rename to src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs
index 63198335d..4e1f28a10 100644
--- a/src/AtomUI.Controls.DataGrid/Column/DataGridFilterIndicator.cs
+++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs
@@ -1,4 +1,3 @@
-using AtomUI.IconPkg;
using AtomUI.IconPkg.AntDesign;
using Avalonia;
using Avalonia.Controls.Primitives;
@@ -6,31 +5,13 @@ using Avalonia.Data;
namespace AtomUI.Controls;
-internal class DataGridFilterIndicator : TemplatedControl
+internal class DataGridFilterIndicator : IconButton
{
#region 公共属性定义
-
- public static readonly StyledProperty IconProperty
- = AvaloniaProperty.Register(nameof(Icon));
- public static readonly StyledProperty IsMotionEnabledProperty
- = MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner();
-
public static readonly StyledProperty IsFilterActivatedProperty
= AvaloniaProperty.Register(nameof(IsFilterActivated));
- public Icon? Icon
- {
- get => GetValue(IconProperty);
- set => SetValue(IconProperty, value);
- }
-
- public bool IsMotionEnabled
- {
- get => GetValue(IsMotionEnabledProperty);
- set => SetValue(IsMotionEnabledProperty, value);
- }
-
public bool IsFilterActivated
{
get => GetValue(IsFilterActivatedProperty);
diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridFilterItem.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterItem.cs
similarity index 100%
rename from src/AtomUI.Controls.DataGrid/Column/DataGridFilterItem.cs
rename to src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterItem.cs
diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs
new file mode 100644
index 000000000..84de93109
--- /dev/null
+++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs
@@ -0,0 +1,6 @@
+namespace AtomUI.Controls;
+
+public class DataGridMenuFilterFlyout
+{
+
+}
\ No newline at end of file
diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs
new file mode 100644
index 000000000..24a65bd44
--- /dev/null
+++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs
@@ -0,0 +1,6 @@
+namespace AtomUI.Controls;
+
+public class DataGridTreeFilterFlyout
+{
+
+}
\ No newline at end of file
diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFlyoutPresenter.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFlyoutPresenter.cs
new file mode 100644
index 000000000..ff1ced797
--- /dev/null
+++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFlyoutPresenter.cs
@@ -0,0 +1,6 @@
+namespace AtomUI.Controls;
+
+public class DataGridTreeFlyoutPresenter : TreeView
+{
+
+}
\ No newline at end of file
diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs
index e6b501a5f..665978db9 100644
--- a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs
+++ b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs
@@ -1528,6 +1528,7 @@ public partial class DataGrid
dataGridColumn.HeaderCell.IsVisible = dataGridColumn.IsVisible;
Debug.Assert(!_columnHeadersPresenter.Children.Contains(dataGridColumn.HeaderCell));
dataGridColumn.HeaderCell.CanUserSort = dataGridColumn.CanUserSort;
+ dataGridColumn.HeaderCell.CanUserFilter = dataGridColumn.CanUserFilter;
_columnHeadersPresenter.Children.Insert(dataGridColumn.DisplayIndexWithFiller, dataGridColumn.HeaderCell);
}
}
diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs b/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs
index f3f1a6825..0d0ab977c 100644
--- a/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs
+++ b/src/AtomUI.Controls.DataGrid/DataGrid.Privates.cs
@@ -29,6 +29,7 @@ public partial class DataGrid
internal const bool DefaultCanUserReorderColumns = true;
internal const bool DefaultCanUserResizeColumns = true;
internal const bool DefaultCanUserSortColumns = false;
+ internal const bool DefaultCanUserFilterColumns = false;
#region 内部属性定义
@@ -1338,7 +1339,8 @@ public partial class DataGrid
column.HeaderCell.IsMiddleVisible = true;
}
- column.HeaderCell.CanUserSort = column.CanUserSort;
+ column.HeaderCell.CanUserSort = column.CanUserSort;
+ column.HeaderCell.CanUserFilter = column.CanUserFilter;
}
PseudoClasses.Set(DataGridPseudoClass.EmptyColumns, !visibleColumns.Any());
PseudoClasses.Set(DataGridPseudoClass.EmptyRows, !DataConnection.Any());
diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.cs b/src/AtomUI.Controls.DataGrid/DataGrid.cs
index 475b89c80..449cfb1d0 100644
--- a/src/AtomUI.Controls.DataGrid/DataGrid.cs
+++ b/src/AtomUI.Controls.DataGrid/DataGrid.cs
@@ -65,6 +65,12 @@ public partial class DataGrid : TemplatedControl,
public static readonly StyledProperty CanUserSortColumnsProperty =
AvaloniaProperty.Register(nameof(CanUserSortColumns), false);
+ ///
+ /// Identifies the CanUserFilterColumns dependency property.
+ ///
+ public static readonly StyledProperty CanUserFilterColumnsProperty =
+ AvaloniaProperty.Register(nameof(CanUserFilterColumns), false);
+
///
/// Identifies the ColumnHeaderHeight dependency property.
///
@@ -229,6 +235,15 @@ public partial class DataGrid : TemplatedControl,
get => GetValue(CanUserSortColumnsProperty);
set => SetValue(CanUserSortColumnsProperty, value);
}
+
+ ///
+ /// Gets or sets a value that indicates whether the user can filter columns by clicking the column filter indicator.
+ ///
+ public bool CanUserFilterColumns
+ {
+ get => GetValue(CanUserFilterColumnsProperty);
+ set => SetValue(CanUserFilterColumnsProperty, value);
+ }
///
/// Gets or sets the height of the column headers row.
diff --git a/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml
index 14b28b518..d68db750e 100644
--- a/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml
+++ b/src/AtomUI.Controls.DataGrid/Themes/DataGridFilterIndicatorTheme.axaml
@@ -1,48 +1,37 @@
+ xmlns:atom="https://atomui.net"
+ xmlns:themes="using:AtomUI.Controls.Themes">
-
-
-
-
-
-
-
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridTreeFlyoutPresenterTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridTreeFlyoutPresenterTheme.axaml
new file mode 100644
index 000000000..226e8b252
--- /dev/null
+++ b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridTreeFlyoutPresenterTheme.axaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs b/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs
new file mode 100644
index 000000000..ac35a865a
--- /dev/null
+++ b/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs
@@ -0,0 +1,14 @@
+using System.Globalization;
+using Avalonia.Data.Converters;
+
+namespace AtomUI.Controls.Converters;
+
+internal class DataGridFilterIndicatorVisibleConvert : IMultiValueConverter
+{
+ public static readonly DataGridFilterIndicatorVisibleConvert Default = new();
+
+ public object Convert(IList