Browse Source

Use GetObservable and AvaProperty.UnSet

pull/4963/head
artyom 6 years ago
parent
commit
c404dcf1c7
  1. 27
      src/Avalonia.ReactiveUI/ReactiveUserControl.cs
  2. 27
      src/Avalonia.ReactiveUI/ReactiveWindow.cs
  3. 71
      tests/Avalonia.ReactiveUI.UnitTests/ReactiveUserControlTest.cs

27
src/Avalonia.ReactiveUI/ReactiveUserControl.cs

@ -29,10 +29,29 @@ namespace Avalonia.ReactiveUI
// block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { });
this.ObservableForProperty(x => x.ViewModel, false, true)
.Subscribe(args => DataContext = args.Value);
this.ObservableForProperty(x => x.DataContext, false, true)
.Subscribe(args => ViewModel = args.Value as TViewModel);
this.GetObservable(DataContextProperty).Subscribe(value =>
{
if (value is TViewModel viewModel)
{
ViewModel = viewModel;
}
else
{
ViewModel = null;
}
});
this.GetObservable(ViewModelProperty).Subscribe(value =>
{
if (value == null)
{
DataContext = AvaloniaProperty.UnsetValue;
}
else
{
DataContext = value;
}
});
}
/// <summary>

27
src/Avalonia.ReactiveUI/ReactiveWindow.cs

@ -29,10 +29,29 @@ namespace Avalonia.ReactiveUI
// block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { });
this.ObservableForProperty(x => x.ViewModel, false, true)
.Subscribe(args => DataContext = args.Value);
this.ObservableForProperty(x => x.DataContext, false, true)
.Subscribe(args => ViewModel = args.Value as TViewModel);
this.GetObservable(DataContextProperty).Subscribe(value =>
{
if (value is TViewModel viewModel)
{
ViewModel = viewModel;
}
else
{
ViewModel = null;
}
});
this.GetObservable(ViewModelProperty).Subscribe(value =>
{
if (value == null)
{
DataContext = AvaloniaProperty.UnsetValue;
}
else
{
DataContext = value;
}
});
}
/// <summary>

71
tests/Avalonia.ReactiveUI.UnitTests/ReactiveUserControlTest.cs

@ -1,4 +1,5 @@
using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.UnitTests;
using ReactiveUI;
using Splat;
@ -100,5 +101,75 @@ namespace Avalonia.ReactiveUI.UnitTests
Assert.NotNull(view.DataContext);
Assert.False(view.ViewModel.IsActive);
}
[Fact]
public void Should_Inherit_DataContext()
{
var vm1 = new ExampleViewModel();
var vm2 = new ExampleViewModel();
var view = new ExampleView();
var root = new TestRoot(view);
Assert.Null(view.DataContext);
Assert.Null(view.ViewModel);
root.DataContext = vm1;
Assert.Same(vm1, view.DataContext);
Assert.Same(vm1, view.ViewModel);
root.DataContext = null;
Assert.Null(view.DataContext);
Assert.Null(view.ViewModel);
root.DataContext = vm2;
Assert.Same(vm2, view.DataContext);
Assert.Same(vm2, view.ViewModel);
}
[Fact]
public void Should_Not_Overlap_Change_Notifications()
{
var vm1 = new ExampleViewModel();
var vm2 = new ExampleViewModel();
var view1 = new ExampleView();
var view2 = new ExampleView();
Assert.Null(view1.DataContext);
Assert.Null(view2.DataContext);
Assert.Null(view1.ViewModel);
Assert.Null(view2.ViewModel);
view1.DataContext = vm1;
Assert.Same(vm1, view1.DataContext);
Assert.Same(vm1, view1.ViewModel);
Assert.Null(view2.DataContext);
Assert.Null(view2.ViewModel);
view2.DataContext = vm2;
Assert.Same(vm1, view1.DataContext);
Assert.Same(vm1, view1.ViewModel);
Assert.Same(vm2, view2.DataContext);
Assert.Same(vm2, view2.ViewModel);
view1.ViewModel = null;
Assert.Null(view1.DataContext);
Assert.Null(view1.ViewModel);
Assert.Same(vm2, view2.DataContext);
Assert.Same(vm2, view2.ViewModel);
view2.ViewModel = null;
Assert.Null(view1.DataContext);
Assert.Null(view2.DataContext);
Assert.Null(view1.ViewModel);
Assert.Null(view2.ViewModel);
}
}
}

Loading…
Cancel
Save