Browse Source

Show default content when Router is null

pull/4473/head
artyom 6 years ago
parent
commit
f23bfafbae
  1. 8
      src/Avalonia.ReactiveUI/RoutedViewHost.cs
  2. 34
      tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs

8
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
/// <param name="viewModel">ViewModel to which the user navigates.</param>
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.");

34
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);
}
}
}
Loading…
Cancel
Save