Browse Source

Show DefaultContent when Router is set to null

pull/4473/head
artyom 6 years ago
parent
commit
0bbe036437
  1. 12
      src/Avalonia.ReactiveUI/RoutedViewHost.cs
  2. 50
      tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs
  3. 54
      tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs

12
src/Avalonia.ReactiveUI/RoutedViewHost.cs

@ -65,9 +65,15 @@ namespace Avalonia.ReactiveUI
{ {
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {
this.WhenAnyObservable(x => x.Router.CurrentViewModel) var routerRemoved = this
.StartWith(default(object)) .WhenAnyValue(x => x.Router)
.DistinctUntilChanged() .Where(router => router == null)
.Cast<object>();
this.WhenAnyValue(x => x.Router)
.Where(router => router != null)
.SelectMany(router => router.CurrentViewModel)
.Merge(routerRemoved)
.Subscribe(NavigateToViewModel) .Subscribe(NavigateToViewModel)
.DisposeWith(disposables); .DisposeWith(disposables);
}); });

50
tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs

@ -61,15 +61,7 @@ namespace Avalonia.ReactiveUI.UnitTests
} }
[Fact] [Fact]
public void Should_Not_Override_Data_Template_Binding_When_Item_Template_Is_Set() public void Should_Use_ViewModelViewHost_As_Data_Template_By_Default()
{
var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate());
Assert.NotNull(view.List.ItemTemplate);
Assert.IsType<FuncDataTemplate<TextBlock>>(view.List.ItemTemplate);
}
[Fact]
public void Should_Use_View_Model_View_Host_As_Data_Template()
{ {
var view = new ExampleView(); var view = new ExampleView();
view.ViewModel.Items.Add(new NestedViewModel()); view.ViewModel.Items.Add(new NestedViewModel());
@ -82,22 +74,36 @@ namespace Avalonia.ReactiveUI.UnitTests
} }
[Fact] [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()); view.ViewModel.Items.Add(new NestedViewModel());
var child = view.List.Presenter.Panel.Children[0]; var child = view.List.Presenter.Panel.Children[0];
var container = (ContentPresenter) child; var container = (ContentPresenter) child;
container.UpdateChild(); container.UpdateChild();
Assert.IsType<TextBlock>(container.Child); var host = (ViewModelViewHost) container.Child;
Assert.IsType<NestedViewModel>(host.ViewModel);
Assert.IsType<NestedViewModel>(host.DataContext);
host.DataContext = "changed context";
Assert.IsType<string>(host.ViewModel);
Assert.IsType<string>(host.DataContext);
} }
[Fact] [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<FuncDataTemplate<TextBlock>>(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()); view.ViewModel.Items.Add(new NestedViewModel());
var child = view.List.Presenter.Panel.Children[0]; var child = view.List.Presenter.Panel.Children[0];
@ -106,24 +112,18 @@ namespace Avalonia.ReactiveUI.UnitTests
Assert.IsType<TextBlock>(container.Child); Assert.IsType<TextBlock>(container.Child);
} }
[Fact] [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()); view.ViewModel.Items.Add(new NestedViewModel());
var child = view.List.Presenter.Panel.Children[0]; var child = view.List.Presenter.Panel.Children[0];
var container = (ContentPresenter) child; var container = (ContentPresenter) child;
container.UpdateChild(); container.UpdateChild();
var host = (ViewModelViewHost) container.Child; Assert.IsType<TextBlock>(container.Child);
Assert.IsType<NestedViewModel>(host.ViewModel);
Assert.IsType<NestedViewModel>(host.DataContext);
host.DataContext = "changed context";
Assert.IsType<string>(host.ViewModel);
Assert.IsType<string>(host.DataContext);
} }
private static FuncDataTemplate GetItemTemplate() private static FuncDataTemplate GetItemTemplate()

54
tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs

@ -62,50 +62,42 @@ namespace Avalonia.ReactiveUI.UnitTests
PageTransition = null PageTransition = null
}; };
var root = new TestRoot var root = new TestRoot
{ {
Child = host Child = host
}; };
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(TextBlock), host.Content.GetType()); Assert.IsType<TextBlock>(host.Content);
Assert.Equal(defaultContent, host.Content); Assert.Equal(defaultContent, host.Content);
var first = new FirstRoutableViewModel(); var first = new FirstRoutableViewModel();
screen.Router.Navigate screen.Router.Navigate.Execute(first).Subscribe();
.Execute(first)
.Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); Assert.IsType<FirstRoutableView>(host.Content);
Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext); Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext);
Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel); Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel);
var second = new SecondRoutableViewModel(); var second = new SecondRoutableViewModel();
screen.Router.Navigate screen.Router.Navigate.Execute(second).Subscribe();
.Execute(second)
.Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(SecondRoutableView), host.Content.GetType()); Assert.IsType<SecondRoutableView>(host.Content);
Assert.Equal(second, ((SecondRoutableView)host.Content).DataContext); Assert.Equal(second, ((SecondRoutableView)host.Content).DataContext);
Assert.Equal(second, ((SecondRoutableView)host.Content).ViewModel); Assert.Equal(second, ((SecondRoutableView)host.Content).ViewModel);
screen.Router.NavigateBack screen.Router.NavigateBack.Execute(Unit.Default).Subscribe();
.Execute(Unit.Default)
.Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); Assert.IsType<FirstRoutableView>(host.Content);
Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext); Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext);
Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel); Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel);
screen.Router.NavigateBack screen.Router.NavigateBack.Execute(Unit.Default).Subscribe();
.Execute(Unit.Default)
.Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(TextBlock), host.Content.GetType()); Assert.IsType<TextBlock>(host.Content);
Assert.Equal(defaultContent, host.Content); Assert.Equal(defaultContent, host.Content);
} }
@ -121,9 +113,9 @@ namespace Avalonia.ReactiveUI.UnitTests
Router = null Router = null
}; };
var root = new TestRoot var root = new TestRoot
{ {
Child = host Child = host
}; };
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
@ -138,9 +130,17 @@ namespace Avalonia.ReactiveUI.UnitTests
screen.Router.Navigate.Execute(first).Subscribe(); screen.Router.Navigate.Execute(first).Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); Assert.IsType<FirstRoutableView>(host.Content);
Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext);
Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel); host.Router = null;
Assert.NotNull(host.Content);
Assert.Equal(defaultContent, host.Content);
host.Router = screen.Router;
Assert.NotNull(host.Content);
Assert.IsType<FirstRoutableView>(host.Content);
} }
} }
} }

Loading…
Cancel
Save