From 05a742bc5ecab4e0e6af51a189748de99c150d5a Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 17 Apr 2024 20:47:46 -0700 Subject: [PATCH] Fix ReactiveUI regression, when DataContext type is different (#15423) --- src/Avalonia.ReactiveUI/ReactiveUserControl.cs | 5 +++-- src/Avalonia.ReactiveUI/ReactiveWindow.cs | 5 +++-- .../ReactiveUserControlTest.cs | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.ReactiveUI/ReactiveUserControl.cs b/src/Avalonia.ReactiveUI/ReactiveUserControl.cs index 94090f2614..76a4f29b16 100644 --- a/src/Avalonia.ReactiveUI/ReactiveUserControl.cs +++ b/src/Avalonia.ReactiveUI/ReactiveUserControl.cs @@ -48,14 +48,15 @@ namespace Avalonia.ReactiveUI if (change.Property == DataContextProperty) { - if (Object.ReferenceEquals(change.OldValue, ViewModel)) + if (ReferenceEquals(change.OldValue, ViewModel) + && change.NewValue is null or TViewModel) { SetCurrentValue(ViewModelProperty, change.NewValue); } } else if (change.Property == ViewModelProperty) { - if (Object.ReferenceEquals(change.OldValue, DataContext)) + if (ReferenceEquals(change.OldValue, DataContext)) { SetCurrentValue(DataContextProperty, change.NewValue); } diff --git a/src/Avalonia.ReactiveUI/ReactiveWindow.cs b/src/Avalonia.ReactiveUI/ReactiveWindow.cs index 727c22f016..4048ef1e25 100644 --- a/src/Avalonia.ReactiveUI/ReactiveWindow.cs +++ b/src/Avalonia.ReactiveUI/ReactiveWindow.cs @@ -48,14 +48,15 @@ namespace Avalonia.ReactiveUI if (change.Property == DataContextProperty) { - if (Object.ReferenceEquals(change.OldValue, ViewModel)) + if (ReferenceEquals(change.OldValue, ViewModel) + && change.NewValue is null or TViewModel) { SetCurrentValue(ViewModelProperty, change.NewValue); } } else if (change.Property == ViewModelProperty) { - if (Object.ReferenceEquals(change.OldValue, DataContext)) + if (ReferenceEquals(change.OldValue, DataContext)) { SetCurrentValue(DataContextProperty, change.NewValue); } diff --git a/tests/Avalonia.ReactiveUI.UnitTests/ReactiveUserControlTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/ReactiveUserControlTest.cs index 4bf999bed0..67790789e3 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/ReactiveUserControlTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/ReactiveUserControlTest.cs @@ -134,6 +134,22 @@ namespace Avalonia.ReactiveUI.UnitTests Assert.Same(vm2, view.ViewModel); } + // https://github.com/AvaloniaUI/Avalonia/issues/15060 + [Fact] + public void Should_Not_Inherit_DataContext_Of_Wrong_Type() + { + var view = new ExampleView(); + var root = new TestRoot(view); + + Assert.Null(view.DataContext); + Assert.Null(view.ViewModel); + + root.DataContext = this; + + Assert.Same(this, view.DataContext); + Assert.Null(view.ViewModel); + } + [Fact] public void Should_Not_Overlap_Change_Notifications() {