Attempt to fix a bunch of navigation issues

This commit is contained in:
TheXamlGuy
2024-05-26 11:09:56 +01:00
parent c0c1a82846
commit 6a2708c111
2 changed files with 32 additions and 53 deletions
+20 -50
View File
@@ -18,18 +18,15 @@ public class FrameHandler :
frame.NavigationPageFactory ??= new NavigationPageFactory(); frame.NavigationPageFactory ??= new NavigationPageFactory();
if (args.Template is Control control) if (args.Template is Control control)
{ {
void NavigatingFrom(object? sender, void NavigatingFrom(Control sender)
Control control)
{ {
async void HandleNavigatingFrom(object? _, async void HandleNavigatingFrom(object? _,
NavigatingCancelEventArgs args) NavigatingCancelEventArgs args)
{ {
Dictionary<string, object> results = []; sender.RemoveHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom);
NavigatedFrom(sender);
control.RemoveHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); if (sender.DataContext is object content)
NavigatedFrom(sender, control, () => results);
if (control.DataContext is object content)
{ {
if (content is IConfirmation confirmation && if (content is IConfirmation confirmation &&
!await confirmation.Confirm()) !await confirmation.Confirm())
@@ -47,68 +44,41 @@ public class FrameHandler :
} }
} }
control.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom); sender.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom);
} }
void NavigatedFrom(object? sender, void NavigatedFrom(Control sender)
Control control,
Func<Dictionary<string, object>> resultCallBack)
{ {
async void HandleNavigatedFrom(object? _, async void HandleNavigatedFrom(object? _,
NavigationEventArgs args) NavigationEventArgs args)
{ {
control.RemoveHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom); sender.RemoveHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
if (args.NavigationMode == NavigationMode.New) if (sender.DataContext is object content)
{
NavigatedTo(sender, control);
}
Dictionary<string, object> 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 (content is IDisposable disposable)
{
disposable.Dispose();
}
} }
} }
if (args.Source is TemplatedControl sourceTemplate) sender.AddHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
{
if (sourceTemplate.DataContext is object content)
{
await DoNavigatedFromAsync(content);
}
} }
if (sender is TemplatedControl senderTemplate) void NavigatedTo(Control sender)
{
if (senderTemplate.DataContext is object content)
{
await DoNavigatedFromAsync(content);
}
}
else
{
await DoNavigatedFromAsync(sender);
}
}
control.AddHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
}
void NavigatedTo(object? sender,
Control control)
{ {
async void HandleNavigatedTo(object? _, async void HandleNavigatedTo(object? _,
NavigationEventArgs __) NavigationEventArgs __)
{ {
control.RemoveHandler(Frame.NavigatedToEvent, HandleNavigatedTo); sender.RemoveHandler(Frame.NavigatedToEvent, HandleNavigatedTo);
NavigatingFrom(sender, control); NavigatingFrom(sender);
if (control.DataContext is object content) if (sender.DataContext is object content)
{ {
if (content is IInitializer initializer) 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; control.DataContext = args.Content;
NavigatedTo(args.Sender, control); NavigatedTo(control);
frame.NavigateFromObject(control, new FrameNavigationOptions { TransitionInfoOverride = new SuppressNavigationTransitionInfo() }); frame.NavigateFromObject(control, new FrameNavigationOptions { TransitionInfoOverride = new SuppressNavigationTransitionInfo() });
} }
} }
+13 -4
View File
@@ -319,10 +319,8 @@ public partial class ObservableCollection<TItem> :
return Task.CompletedTask; return Task.CompletedTask;
} }
public Task Handle(SelectionEventArgs<TItem> args) public Task Handle(SelectionEventArgs<TItem> args) =>
{ Task.CompletedTask;
return Task.CompletedTask;
}
public int IndexOf(TItem item) => public int IndexOf(TItem item) =>
collection.IndexOf(item); collection.IndexOf(item);
@@ -513,6 +511,17 @@ public partial class ObservableCollection<TItem> :
added.Selected = true; 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<TValue, TViewModel>(IServiceProvider provider, public partial class ObservableCollection<TValue, TViewModel>(IServiceProvider provider,