From d29da7bbc68ee254024c2137db1e7e02f805fcc6 Mon Sep 17 00:00:00 2001 From: Waheed Ahmad Date: Fri, 5 Jun 2026 17:24:14 +0500 Subject: [PATCH 1/4] Fix filter flyout search behavior by using custom MenuFlyout control --- .../TableViewFilterItemsControl.xaml.cs | 22 ++-- src/TableViewColumnHeader.OptionComamnds.cs | 25 +---- src/TableViewColumnHeader.cs | 68 ++++-------- src/TableViewFilterMenuFlyout.cs | 102 ++++++++++++++++++ src/Themes/TableViewColumnHeader.xaml | 87 +++++++++------ 5 files changed, 196 insertions(+), 108 deletions(-) create mode 100644 src/TableViewFilterMenuFlyout.cs diff --git a/src/Controls/TableViewFilterItemsControl.xaml.cs b/src/Controls/TableViewFilterItemsControl.xaml.cs index 50b2c42c..16d553c9 100644 --- a/src/Controls/TableViewFilterItemsControl.xaml.cs +++ b/src/Controls/TableViewFilterItemsControl.xaml.cs @@ -49,10 +49,7 @@ internal async void Initialize() /// internal void ClearSearchBox() { - if (searchBox is not null) - { - searchBox.Text = string.Empty; - } + searchBox?.Text = string.Empty; } private void OnSearchBoxTextChanged(object sender, TextChangedEventArgs e) @@ -67,7 +64,8 @@ private void OnSearchBoxKeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Enter && searchBox?.Text.Length > 0) { - ColumnHeader?.ExecuteOkCommand(); + ColumnHeader?.HideFlyout(); + ColumnHeader?.ApplyFilter(); e.Handled = true; } @@ -175,7 +173,19 @@ internal ICollection? FilterItems /// /// Gets or sets the column header associated with the filter items control. /// - public TableViewColumnHeader? ColumnHeader { get; internal set; } + public TableViewColumnHeader? ColumnHeader + { + get; + set + { + if (value is { FilterItemsControl: null }) + { + value.FilterItemsControl = this; + } + + field = value; + } + } /// /// Gets or sets the TableView associated with the filter items control. diff --git a/src/TableViewColumnHeader.OptionComamnds.cs b/src/TableViewColumnHeader.OptionComamnds.cs index fb78faca..99d4f6a3 100644 --- a/src/TableViewColumnHeader.OptionComamnds.cs +++ b/src/TableViewColumnHeader.OptionComamnds.cs @@ -1,6 +1,5 @@ using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; -using WinUI.TableView.Extensions; using SD = WinUI.TableView.SortDirection; namespace WinUI.TableView; @@ -11,9 +10,7 @@ partial class TableViewColumnHeader private readonly StandardUICommand _sortAscendingCommand = new() { Label = TableViewLocalizedStrings.SortAscending }; private readonly StandardUICommand _sortDescendingCommand = new() { Label = TableViewLocalizedStrings.SortDescending }; private readonly StandardUICommand _clearSortingCommand = new() { Label = TableViewLocalizedStrings.ClearSorting }; - private readonly StandardUICommand _clearFilterCommand = new() { Label = TableViewLocalizedStrings.ClearFilter }; - private readonly StandardUICommand _okCommand = new() { Label = TableViewLocalizedStrings.Ok }; - private readonly StandardUICommand _cancelCommand = new() { Label = TableViewLocalizedStrings.Cancel }; + private readonly StandardUICommand _clearFilterCommand = new() { Label = TableViewLocalizedStrings.ClearFilter }; /// /// Sets commands to option menu items. @@ -30,15 +27,6 @@ private void SetOptionCommands() clearSortingMenuItem.Command = _clearSortingCommand; if (GetTemplateChild("ClearFilterMenuItem") is MenuFlyoutItem clearFilterMenuItem) clearFilterMenuItem.Command = _clearFilterCommand; - if (GetTemplateChild("ActionButtonsMenuItem") is MenuFlyoutItem actionButtonsMenuItem) - { - actionButtonsMenuItem.ApplyTemplate(); - - if (actionButtonsMenuItem.FindDescendant From 57ac27ed650393a88db7b3641dec110e6f012300 Mon Sep 17 00:00:00 2001 From: Waheed Ahmad Date: Mon, 8 Jun 2026 17:52:00 +0500 Subject: [PATCH 2/4] Refactor filter flyout to use Flyout --- src/TableViewFilterMenuFlyout.cs | 39 ++++++++++--- src/Themes/TableViewColumnHeader.xaml | 82 +++++++++++++++------------ 2 files changed, 78 insertions(+), 43 deletions(-) diff --git a/src/TableViewFilterMenuFlyout.cs b/src/TableViewFilterMenuFlyout.cs index 4c03ff3a..08b7f790 100644 --- a/src/TableViewFilterMenuFlyout.cs +++ b/src/TableViewFilterMenuFlyout.cs @@ -1,7 +1,8 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Input; +using System.Collections.Generic; +using System.Linq; using WinUI.TableView.Controls; using WinUI.TableView.Extensions; @@ -10,7 +11,7 @@ namespace WinUI.TableView; /// /// Represents the filter menu flyout for a TableViewColumnHeader. /// -public partial class TableViewFilterMenuFlyout : MenuFlyout +public partial class TableViewFilterMenuFlyout : Flyout { private TableViewFilterItemsControl? _filterItemsControl; private readonly StandardUICommand _okCommand = new() { Label = TableViewLocalizedStrings.Ok }; @@ -21,8 +22,9 @@ public partial class TableViewFilterMenuFlyout : MenuFlyout /// public TableViewFilterMenuFlyout() { + Items = []; Opening += OnOpening; - Closing += OnClosing; + Closed += OnClosed; } /// @@ -31,13 +33,14 @@ public TableViewFilterMenuFlyout() ~TableViewFilterMenuFlyout() { Opening -= OnOpening; - Closing -= OnClosing; + Closed -= OnClosed; } /// protected override Control CreatePresenter() { var presenter = base.CreatePresenter(); + presenter.Style = FlyoutPresenterStyle; presenter.Loaded += OnPresenterLoaded; return presenter; @@ -52,9 +55,9 @@ private void OnOpening(object? sender, object e) } /// - /// Handles the Closing event of the flyout, clearing the search box in the filter items control. + /// Handles the Closed event of the flyout, clearing the search box in the filter items control. /// - private void OnClosing(FlyoutBase sender, FlyoutBaseClosingEventArgs args) + private void OnClosed(object? sender, object e) { _filterItemsControl?.ClearSearchBox(); } @@ -64,9 +67,11 @@ private void OnClosing(FlyoutBase sender, FlyoutBaseClosingEventArgs args) /// private void OnPresenterLoaded(object sender, RoutedEventArgs e) { - var presenter = (MenuFlyoutPresenter)sender; + var presenter = (FlyoutPresenter)sender; var okButton = presenter.FindDescendant From 9bc2d37d591a09e6942c7268cc12fb162d838bc7 Mon Sep 17 00:00:00 2001 From: Waheed Ahmad Date: Mon, 8 Jun 2026 18:23:10 +0500 Subject: [PATCH 3/4] Adjust MenuFlyoutItem padding in column header flyout --- src/Themes/TableViewColumnHeader.xaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Themes/TableViewColumnHeader.xaml b/src/Themes/TableViewColumnHeader.xaml index cc958fc1..a1173c8f 100644 --- a/src/Themes/TableViewColumnHeader.xaml +++ b/src/Themes/TableViewColumnHeader.xaml @@ -186,7 +186,14 @@ IsDefaultShadowEnabled="False" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" - VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> + VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> + + + + From 29a6bee94c46b0a8405e2d0b1f47c540b8bdca93 Mon Sep 17 00:00:00 2001 From: Waheed Ahmad Date: Mon, 8 Jun 2026 20:12:43 +0500 Subject: [PATCH 4/4] Remove unused field and refactor command handler setup --- src/TableViewColumnHeader.cs | 2 -- src/TableViewFilterMenuFlyout.cs | 12 ++---------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/TableViewColumnHeader.cs b/src/TableViewColumnHeader.cs index 7f60b903..03029529 100644 --- a/src/TableViewColumnHeader.cs +++ b/src/TableViewColumnHeader.cs @@ -38,7 +38,6 @@ public partial class TableViewColumnHeader : ContentControl private TableViewHeaderRow? _headerRow; private Button? _optionsButton; private TableViewFilterMenuFlyout? _optionsFlyout; - private MenuFlyoutItem? _filterItemsMenuItem; private ContentPresenter? _contentPresenter; private Rectangle? _v_gridLine; private bool _resizeStarted; @@ -240,7 +239,6 @@ protected override void OnApplyTemplate() _headerRow = this.FindAscendant(); _optionsButton = GetTemplateChild("OptionsButton") as Button; _optionsFlyout = GetTemplateChild("OptionsFlyout") as TableViewFilterMenuFlyout; - _filterItemsMenuItem = GetTemplateChild("FilterItemsMenuItem") as MenuFlyoutItem; _contentPresenter = GetTemplateChild("ContentPresenter") as ContentPresenter; _v_gridLine = GetTemplateChild("VerticalGridLine") as Rectangle; diff --git a/src/TableViewFilterMenuFlyout.cs b/src/TableViewFilterMenuFlyout.cs index 08b7f790..053fb8bf 100644 --- a/src/TableViewFilterMenuFlyout.cs +++ b/src/TableViewFilterMenuFlyout.cs @@ -25,15 +25,9 @@ public TableViewFilterMenuFlyout() Items = []; Opening += OnOpening; Closed += OnClosed; - } - /// - /// Finalizes an instance of the class. - /// - ~TableViewFilterMenuFlyout() - { - Opening -= OnOpening; - Closed -= OnClosed; + _okCommand.ExecuteRequested += delegate { ExecuteOkCommand(); }; + _cancelCommand.ExecuteRequested += delegate { Hide(); }; } /// @@ -76,8 +70,6 @@ private void OnPresenterLoaded(object sender, RoutedEventArgs e) _filterItemsControl = presenter.FindDescendant(); _filterItemsControl?.TableView = TableView; _filterItemsControl?.ColumnHeader = ColumnHeader; - _okCommand.ExecuteRequested += delegate { ExecuteOkCommand(); }; - _cancelCommand.ExecuteRequested += delegate { Hide(); }; okButton?.Command = _okCommand; cancelButton?.Command = _cancelCommand;