Browse Source

Synchronize DataContext with ReactiveUI.IViewFor.ViewModel property

pull/2353/head
artyom 8 years ago
parent
commit
5e7a5b460c
  1. 2
      src/Avalonia.ReactiveUI/RoutedViewHost.cs
  2. 14
      tests/Avalonia.ReactiveUI.UnitTests/RoutedViewHostTest.cs

2
src/Avalonia.ReactiveUI/RoutedViewHost.cs

@ -163,6 +163,8 @@ namespace Avalonia
this.Log().Info($"Ready to show {view} with autowired {viewModel}."); this.Log().Info($"Ready to show {view} with autowired {viewModel}.");
view.ViewModel = viewModel; view.ViewModel = viewModel;
if (view is IStyledElement styled)
styled.DataContext = viewModel;
UpdateContent(view); UpdateContent(view);
} }

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

@ -50,7 +50,7 @@ namespace Avalonia
} }
[Fact] [Fact]
public void RoutedViewHostShouldStayInSyncWithRoutingState() public void RoutedViewHost_Should_Stay_In_Sync_With_RoutingState()
{ {
var screen = new ScreenViewModel(); var screen = new ScreenViewModel();
var defaultContent = new TextBlock(); var defaultContent = new TextBlock();
@ -71,19 +71,25 @@ namespace Avalonia
Assert.Equal(typeof(TextBlock), host.Content.GetType()); Assert.Equal(typeof(TextBlock), host.Content.GetType());
Assert.Equal(defaultContent, host.Content); Assert.Equal(defaultContent, host.Content);
var first = new FirstRoutableViewModel();
screen.Router.Navigate screen.Router.Navigate
.Execute(new FirstRoutableViewModel()) .Execute(first)
.Subscribe(); .Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); Assert.Equal(typeof(FirstRoutableView), host.Content.GetType());
Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext);
Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel);
var second = new SecondRoutableViewModel();
screen.Router.Navigate screen.Router.Navigate
.Execute(new SecondRoutableViewModel()) .Execute(second)
.Subscribe(); .Subscribe();
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(SecondRoutableView), host.Content.GetType()); Assert.Equal(typeof(SecondRoutableView), host.Content.GetType());
Assert.Equal(second, ((SecondRoutableView)host.Content).DataContext);
Assert.Equal(second, ((SecondRoutableView)host.Content).ViewModel);
screen.Router.NavigateBack screen.Router.NavigateBack
.Execute(Unit.Default) .Execute(Unit.Default)
@ -91,6 +97,8 @@ namespace Avalonia
Assert.NotNull(host.Content); Assert.NotNull(host.Content);
Assert.Equal(typeof(FirstRoutableView), host.Content.GetType()); Assert.Equal(typeof(FirstRoutableView), host.Content.GetType());
Assert.Equal(first, ((FirstRoutableView)host.Content).DataContext);
Assert.Equal(first, ((FirstRoutableView)host.Content).ViewModel);
screen.Router.NavigateBack screen.Router.NavigateBack
.Execute(Unit.Default) .Execute(Unit.Default)

Loading…
Cancel
Save