From 0bbe03643744a9a1563da82e55a290fea4449a21 Mon Sep 17 00:00:00 2001 From: artyom Date: Tue, 11 Aug 2020 10:35:29 +0300 Subject: [PATCH] Show DefaultContent when Router is set to null --- src/Avalonia.ReactiveUI/RoutedViewHost.cs | 12 +++-- .../AutoDataTemplateBindingHookTest.cs | 50 ++++++++--------- .../RoutedViewHostTest.cs | 54 +++++++++---------- 3 files changed, 61 insertions(+), 55 deletions(-) diff --git a/src/Avalonia.ReactiveUI/RoutedViewHost.cs b/src/Avalonia.ReactiveUI/RoutedViewHost.cs index 5520121033..38100f4829 100644 --- a/src/Avalonia.ReactiveUI/RoutedViewHost.cs +++ b/src/Avalonia.ReactiveUI/RoutedViewHost.cs @@ -65,9 +65,15 @@ namespace Avalonia.ReactiveUI { this.WhenActivated(disposables => { - this.WhenAnyObservable(x => x.Router.CurrentViewModel) - .StartWith(default(object)) - .DistinctUntilChanged() + var routerRemoved = this + .WhenAnyValue(x => x.Router) + .Where(router => router == null) + .Cast(); + + this.WhenAnyValue(x => x.Router) + .Where(router => router != null) + .SelectMany(router => router.CurrentViewModel) + .Merge(routerRemoved) .Subscribe(NavigateToViewModel) .DisposeWith(disposables); }); diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs index 0a04d802e2..53bdff5dff 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs @@ -61,15 +61,7 @@ namespace Avalonia.ReactiveUI.UnitTests } [Fact] - public void Should_Not_Override_Data_Template_Binding_When_Item_Template_Is_Set() - { - var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate()); - Assert.NotNull(view.List.ItemTemplate); - Assert.IsType>(view.List.ItemTemplate); - } - - [Fact] - public void Should_Use_View_Model_View_Host_As_Data_Template() + public void Should_Use_ViewModelViewHost_As_Data_Template_By_Default() { var view = new ExampleView(); view.ViewModel.Items.Add(new NestedViewModel()); @@ -82,22 +74,36 @@ namespace Avalonia.ReactiveUI.UnitTests } [Fact] - public void Should_Not_Use_View_Model_View_Host_When_Item_Template_Is_Set() + public void ViewModelViewHost_Should_Resolve_And_Embedd_Appropriate_View_Model() { - var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate()); + var view = new ExampleView(); view.ViewModel.Items.Add(new NestedViewModel()); var child = view.List.Presenter.Panel.Children[0]; var container = (ContentPresenter) child; container.UpdateChild(); - Assert.IsType(container.Child); + var host = (ViewModelViewHost) container.Child; + Assert.IsType(host.ViewModel); + Assert.IsType(host.DataContext); + + host.DataContext = "changed context"; + Assert.IsType(host.ViewModel); + Assert.IsType(host.DataContext); } - + [Fact] - public void Should_Not_Use_View_Model_View_Host_When_Data_Templates_Are_Not_Empty() + public void Should_Not_Override_Data_Template_Binding_When_Item_Template_Is_Set() { - var view = new ExampleView(control => control.DataTemplates.Add(GetItemTemplate())); + var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate()); + Assert.NotNull(view.List.ItemTemplate); + Assert.IsType>(view.List.ItemTemplate); + } + + [Fact] + public void Should_Not_Use_View_Model_View_Host_When_Item_Template_Is_Set() + { + var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate()); view.ViewModel.Items.Add(new NestedViewModel()); var child = view.List.Presenter.Panel.Children[0]; @@ -106,24 +112,18 @@ namespace Avalonia.ReactiveUI.UnitTests Assert.IsType(container.Child); } - + [Fact] - public void Should_Resolve_And_Embedd_Appropriate_View_Model() + public void Should_Not_Use_View_Model_View_Host_When_Data_Templates_Are_Not_Empty() { - var view = new ExampleView(); + var view = new ExampleView(control => control.DataTemplates.Add(GetItemTemplate())); view.ViewModel.Items.Add(new NestedViewModel()); var child = view.List.Presenter.Panel.Children[0]; var container = (ContentPresenter) child; container.UpdateChild(); - var host = (ViewModelViewHost) container.Child; - Assert.IsType(host.ViewModel); - Assert.IsType(host.DataContext); - - host.DataContext = "changed context"; - Assert.IsType(host.ViewModel); - Assert.IsType(host.DataContext); + Assert.IsType(container.Child); } private static FuncDataTemplate GetItemTemplate() diff --git a/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs index 5b7f7fe336..b82b1b1acc 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs @@ -62,50 +62,42 @@ namespace Avalonia.ReactiveUI.UnitTests PageTransition = null }; - var root = new TestRoot - { - Child = host + var root = new TestRoot + { + Child = host }; Assert.NotNull(host.Content); - Assert.Equal(typeof(TextBlock), host.Content.GetType()); + Assert.IsType(host.Content); Assert.Equal(defaultContent, host.Content); var first = new FirstRoutableViewModel(); - screen.Router.Navigate - .Execute(first) - .Subscribe(); + screen.Router.Navigate.Execute(first).Subscribe(); Assert.NotNull(host.Content); - Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); + Assert.IsType(host.Content); Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext); Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel); var second = new SecondRoutableViewModel(); - screen.Router.Navigate - .Execute(second) - .Subscribe(); + screen.Router.Navigate.Execute(second).Subscribe(); Assert.NotNull(host.Content); - Assert.Equal(typeof(SecondRoutableView), host.Content.GetType()); + Assert.IsType(host.Content); Assert.Equal(second, ((SecondRoutableView)host.Content).DataContext); Assert.Equal(second, ((SecondRoutableView)host.Content).ViewModel); - screen.Router.NavigateBack - .Execute(Unit.Default) - .Subscribe(); + screen.Router.NavigateBack.Execute(Unit.Default).Subscribe(); Assert.NotNull(host.Content); - Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); + Assert.IsType(host.Content); Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext); Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel); - screen.Router.NavigateBack - .Execute(Unit.Default) - .Subscribe(); + screen.Router.NavigateBack.Execute(Unit.Default).Subscribe(); Assert.NotNull(host.Content); - Assert.Equal(typeof(TextBlock), host.Content.GetType()); + Assert.IsType(host.Content); Assert.Equal(defaultContent, host.Content); } @@ -121,9 +113,9 @@ namespace Avalonia.ReactiveUI.UnitTests Router = null }; - var root = new TestRoot - { - Child = host + var root = new TestRoot + { + Child = host }; Assert.NotNull(host.Content); @@ -138,9 +130,17 @@ namespace Avalonia.ReactiveUI.UnitTests 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); + Assert.IsType(host.Content); + + host.Router = null; + + Assert.NotNull(host.Content); + Assert.Equal(defaultContent, host.Content); + + host.Router = screen.Router; + + Assert.NotNull(host.Content); + Assert.IsType(host.Content); } } -} \ No newline at end of file +}