From 600bb81be151c29b90b99a0516e6e55103bc70c5 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Wed, 19 Aug 2026 17:32:51 +0100 Subject: [PATCH] PostIt: show ViewLocator fallback errors in navigation --- src/PostIt/PostIt/App.axaml.cs | 8 +++++--- src/PostIt/PostIt/ViewLocator.cs | 14 +++++++++++++- src/PostIt/PostIt/ViewModels/MainPageViewModel.cs | 6 +++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/PostIt/PostIt/App.axaml.cs b/src/PostIt/PostIt/App.axaml.cs index 894256fa..91ba662f 100644 --- a/src/PostIt/PostIt/App.axaml.cs +++ b/src/PostIt/PostIt/App.axaml.cs @@ -324,10 +324,12 @@ public partial class App : Application $"Template for {vm.GetType().Name} returned ."); } - if (view is not Page page) + var page = view as Page; + if (page is null) { - throw new InvalidOperationException( - $"Template for {vm.GetType().Name} returned {view.GetType().Name}, expected a Page."); + // NavigationPage expects Page instances. Wrap any fallback control + // (e.g. ViewLocator error TextBlock) into a ContentPage so it can render. + page = new ContentPage { Content = view }; } page.DataContext = vm; diff --git a/src/PostIt/PostIt/ViewLocator.cs b/src/PostIt/PostIt/ViewLocator.cs index 025116d8..fd92c802 100644 --- a/src/PostIt/PostIt/ViewLocator.cs +++ b/src/PostIt/PostIt/ViewLocator.cs @@ -21,6 +21,18 @@ public class ViewLocator : IDataTemplate } public Control Build(object? data) + { + try + { + return BuildCore(data); + } + catch (Exception ex) + { + return new TextBlock { Text = $"ViewLocator threw: {ex}" }; + } + } + + private Control BuildCore(object? data) { return data switch { @@ -32,7 +44,7 @@ public class ViewLocator : IDataTemplate CirclesPageViewModel => _services.GetRequiredService(), PostAclDialogViewModel => _services.GetRequiredService(), null => new TextBlock { Text = "No view for " }, - _ => new TextBlock { Text = $"No view for {data.GetType().Name}" } + _ => new TextBlock { Text = $"No view for {data.GetType().Name}" } }; } diff --git a/src/PostIt/PostIt/ViewModels/MainPageViewModel.cs b/src/PostIt/PostIt/ViewModels/MainPageViewModel.cs index e3a541ea..e8256df6 100644 --- a/src/PostIt/PostIt/ViewModels/MainPageViewModel.cs +++ b/src/PostIt/PostIt/ViewModels/MainPageViewModel.cs @@ -437,7 +437,11 @@ public partial class MainPageViewModel : ViewModelBase [RelayCommand(CanExecute = nameof(CanManageAcl))] public async Task ManageAcl() { - if (SelectedPost is null) return; + if (SelectedPost is null) + { + StatusMessage = "Select an existing post before managing ACL."; + return; + } await ((App)App.Current!).PushPageAsync(GetACLViewModel(SelectedPost)).ConfigureAwait(true); }