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 // This WhenActivated block calls ViewModel's WhenActivated
// block if the ViewModel implements IActivatableViewModel. // block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { }); this.WhenActivated(disposables => { });
this.GetObservable(DataContextProperty).Subscribe(OnDataContextChanged);
this.GetObservable(DataContextProperty).Subscribe(value => this.GetObservable(ViewModelProperty).Subscribe(OnViewModelChanged);
{
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> /// <summary>
@ -68,5 +46,29 @@ namespace Avalonia.ReactiveUI
get => ViewModel; get => ViewModel;
set => ViewModel = (TViewModel)value; 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 // This WhenActivated block calls ViewModel's WhenActivated
// block if the ViewModel implements IActivatableViewModel. // block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { }); this.WhenActivated(disposables => { });
this.GetObservable(DataContextProperty).Subscribe(OnDataContextChanged);
this.GetObservable(DataContextProperty).Subscribe(value => this.GetObservable(ViewModelProperty).Subscribe(OnViewModelChanged);
{
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> /// <summary>
@ -68,5 +46,29 @@ namespace Avalonia.ReactiveUI
get => ViewModel; get => ViewModel;
set => ViewModel = (TViewModel)value; 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