Browse Source

Correct change notification listeners

pull/4963/head
artyom 6 years ago
parent
commit
a6d83bb7ce
  1. 50
      src/Avalonia.ReactiveUI/ReactiveUserControl.cs
  2. 50
      src/Avalonia.ReactiveUI/ReactiveWindow.cs

50
src/Avalonia.ReactiveUI/ReactiveUserControl.cs

@ -28,30 +28,8 @@ namespace Avalonia.ReactiveUI
// This WhenActivated block calls ViewModel's WhenActivated
// block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { });
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;
}
});
this.GetObservable(DataContextProperty).Subscribe(OnDataContextChanged);
this.GetObservable(ViewModelProperty).Subscribe(OnViewModelChanged);
}
/// <summary>
@ -68,5 +46,29 @@ namespace Avalonia.ReactiveUI
get => ViewModel;
set => ViewModel = (TViewModel)value;
}
private void OnDataContextChanged(object value)
{
if (value is TViewModel viewModel)
{
ViewModel = viewModel;
}
else
{
ViewModel = null;
}
}
private void OnViewModelChanged(object value)
{
if (value == null)
{
ClearValue(DataContextProperty);
}
else if (DataContext != value)
{
DataContext = value;
}
}
}
}

50
src/Avalonia.ReactiveUI/ReactiveWindow.cs

@ -28,30 +28,8 @@ namespace Avalonia.ReactiveUI
// This WhenActivated block calls ViewModel's WhenActivated
// block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { });
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;
}
});
this.GetObservable(DataContextProperty).Subscribe(OnDataContextChanged);
this.GetObservable(ViewModelProperty).Subscribe(OnViewModelChanged);
}
/// <summary>
@ -68,5 +46,29 @@ namespace Avalonia.ReactiveUI
get => ViewModel;
set => ViewModel = (TViewModel)value;
}
private void OnDataContextChanged(object value)
{
if (value is TViewModel viewModel)
{
ViewModel = viewModel;
}
else
{
ViewModel = null;
}
}
private void OnViewModelChanged(object value)
{
if (value == null)
{
ClearValue(DataContextProperty);
}
else if (DataContext != value)
{
DataContext = value;
}
}
}
}

Loading…
Cancel
Save