From 6a2708c111dce157223a5db1e8d75a4eed43c6f1 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 26 May 2024 11:09:56 +0100 Subject: [PATCH] Attempt to fix a bunch of navigation issues --- Toolkit.Avalonia/FrameHandler.cs | 68 ++++++---------------- Toolkit.Foundation/ObservableCollection.cs | 17 ++++-- 2 files changed, 32 insertions(+), 53 deletions(-) diff --git a/Toolkit.Avalonia/FrameHandler.cs b/Toolkit.Avalonia/FrameHandler.cs index 2be9c6b..d435a5a 100644 --- a/Toolkit.Avalonia/FrameHandler.cs +++ b/Toolkit.Avalonia/FrameHandler.cs @@ -18,18 +18,15 @@ public class FrameHandler : frame.NavigationPageFactory ??= new NavigationPageFactory(); if (args.Template is Control control) { - void NavigatingFrom(object? sender, - Control control) + void NavigatingFrom(Control sender) { async void HandleNavigatingFrom(object? _, NavigatingCancelEventArgs args) { - Dictionary results = []; + sender.RemoveHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); + NavigatedFrom(sender); - control.RemoveHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); - NavigatedFrom(sender, control, () => results); - - if (control.DataContext is object content) + if (sender.DataContext is object content) { if (content is IConfirmation confirmation && !await confirmation.Confirm()) @@ -47,68 +44,41 @@ public class FrameHandler : } } - control.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); + sender.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); } - void NavigatedFrom(object? sender, - Control control, - Func> resultCallBack) + void NavigatedFrom(Control sender) { async void HandleNavigatedFrom(object? _, NavigationEventArgs args) { - control.RemoveHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom); - if (args.NavigationMode == NavigationMode.New) + sender.RemoveHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom); + if (sender.DataContext is object content) { - NavigatedTo(sender, control); - } - - Dictionary results = resultCallBack.Invoke(); - async Task DoNavigatedFromAsync(object? content) - { - if (content is not null) + if (content is IDeactivated deactivated) { - if (content is IDeactivated deactivated) - { - await deactivated.OnDeactivated(); - } + await deactivated.OnDeactivated(); } - } - if (args.Source is TemplatedControl sourceTemplate) - { - if (sourceTemplate.DataContext is object content) + if (content is IDisposable disposable) { - await DoNavigatedFromAsync(content); + disposable.Dispose(); } } - - if (sender is TemplatedControl senderTemplate) - { - if (senderTemplate.DataContext is object content) - { - await DoNavigatedFromAsync(content); - } - } - else - { - await DoNavigatedFromAsync(sender); - } } - control.AddHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom); + sender.AddHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom); } - void NavigatedTo(object? sender, - Control control) + void NavigatedTo(Control sender) { async void HandleNavigatedTo(object? _, NavigationEventArgs __) { - control.RemoveHandler(Frame.NavigatedToEvent, HandleNavigatedTo); - NavigatingFrom(sender, control); + sender.RemoveHandler(Frame.NavigatedToEvent, HandleNavigatedTo); + NavigatingFrom(sender); - if (control.DataContext is object content) + if (sender.DataContext is object content) { if (content is IInitializer initializer) { @@ -122,11 +92,11 @@ public class FrameHandler : } } - control.AddHandler(Frame.NavigatedToEvent, HandleNavigatedTo); + sender.AddHandler(Frame.NavigatedToEvent, HandleNavigatedTo); } control.DataContext = args.Content; - NavigatedTo(args.Sender, control); + NavigatedTo(control); frame.NavigateFromObject(control, new FrameNavigationOptions { TransitionInfoOverride = new SuppressNavigationTransitionInfo() }); } } diff --git a/Toolkit.Foundation/ObservableCollection.cs b/Toolkit.Foundation/ObservableCollection.cs index d53349a..9024faf 100644 --- a/Toolkit.Foundation/ObservableCollection.cs +++ b/Toolkit.Foundation/ObservableCollection.cs @@ -319,10 +319,8 @@ public partial class ObservableCollection : return Task.CompletedTask; } - public Task Handle(SelectionEventArgs args) - { - return Task.CompletedTask; - } + public Task Handle(SelectionEventArgs args) => + Task.CompletedTask; public int IndexOf(TItem item) => collection.IndexOf(item); @@ -513,6 +511,17 @@ public partial class ObservableCollection : added.Selected = true; } } + + partial void OnSelectedItemChanged(TItem? oldValue, TItem? newValue) + { + if (SelectedItem is not null && !SelectedItem.Equals(oldValue)) + { + if (oldValue is ISelectable selectable) + { + selectable.Selected = false; + } + } + } } public partial class ObservableCollection(IServiceProvider provider,