From f23bfafbaef806b380013ddd7a22a2da190bbf06 Mon Sep 17 00:00:00 2001 From: artyom Date: Mon, 10 Aug 2020 22:40:59 +0300 Subject: [PATCH] Show default content when Router is null --- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 8 +++++ .../RoutedViewHostTest.cs | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 1af8012a20..5520121033 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -66,6 +66,7 @@ namespace Avalonia.ReactiveUI this.WhenActivated(disposables => { this.WhenAnyObservable(x => x.Router.CurrentViewModel) + .StartWith(default(object)) .DistinctUntilChanged() .Subscribe(NavigateToViewModel) .DisposeWith(disposables); @@ -92,6 +93,13 @@ namespace Avalonia.ReactiveUI /// ViewModel to which the user navigates. private void NavigateToViewModel(object viewModel) { + if (Router == null) + { + this.Log().Warn("Router property is null. Falling back to default content."); + Content = DefaultContent; + return; + } + if (viewModel == null) { this.Log().Info("ViewModel is null. Falling back to default content."); diff --git a/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs index f4d9222085..5b7f7fe336 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs @@ -108,5 +108,39 @@ namespace Avalonia.ReactiveUI.UnitTests Assert.Equal(typeof(TextBlock), host.Content.GetType()); Assert.Equal(defaultContent, host.Content); } + + [Fact] + public void RoutedViewHost_Should_Show_Default_Content_When_Router_Is_Null() + { + var screen = new ScreenViewModel(); + var defaultContent = new TextBlock(); + var host = new RoutedViewHost + { + DefaultContent = defaultContent, + PageTransition = null, + Router = null + }; + + var root = new TestRoot + { + Child = host + }; + + Assert.NotNull(host.Content); + Assert.Equal(defaultContent, host.Content); + + host.Router = screen.Router; + + Assert.NotNull(host.Content); + Assert.Equal(defaultContent, host.Content); + + var first = new FirstRoutableViewModel(); + screen.Router.Navigate.Execute(first).Subscribe(); + + Assert.NotNull(host.Content); + Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); + Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext); + Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel); + } } } \ No newline at end of file