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.WhenAnyObservable(x => x.Router.CurrentViewModel)
.StartWith(default(object))
.DistinctUntilChanged()
var routerRemoved = this
.WhenAnyValue(x => x.Router)
.Where(router => router == null)
.Cast<object>();
this.WhenAnyValue(x => x.Router)
.Where(router => router != null)
.SelectMany(router => router.CurrentViewModel)
.Merge(routerRemoved)
.Subscribe(NavigateToViewModel)
.DisposeWith(disposables);
});

50
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<FuncDataTemplate<TextBlock>>(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<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]
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());
var child = view.List.Presenter.Panel.Children[0];
@ -106,24 +112,18 @@ namespace Avalonia.ReactiveUI.UnitTests
Assert.IsType<TextBlock>(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<NestedViewModel>(host.ViewModel);
Assert.IsType<NestedViewModel>(host.DataContext);
host.DataContext = "changed context";
Assert.IsType<string>(host.ViewModel);
Assert.IsType<string>(host.DataContext);
Assert.IsType<TextBlock>(container.Child);
}
private static FuncDataTemplate GetItemTemplate()

54
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<TextBlock>(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<FirstRoutableView>(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<SecondRoutableView>(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<FirstRoutableView>(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<TextBlock>(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<FirstRoutableView>(host.Content);
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