From ad9b7c1027f50f11e89f9117fcecda2cbdb85377 Mon Sep 17 00:00:00 2001 From: Tim U Date: Fri, 11 Mar 2022 12:47:07 +0100 Subject: [PATCH 1/3] Switch disposing order for TwoWayBindingDisposable --- src/Avalonia.Base/Data/BindingOperations.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Data/BindingOperations.cs b/src/Avalonia.Base/Data/BindingOperations.cs index 5353e8175d..0c38f78c83 100644 --- a/src/Avalonia.Base/Data/BindingOperations.cs +++ b/src/Avalonia.Base/Data/BindingOperations.cs @@ -116,8 +116,8 @@ namespace Avalonia.Data return; } - _first.Dispose(); _second.Dispose(); + _first.Dispose(); _isDisposed = true; } From 7794d1b046bd6a5fe9c0148413a9c01858cc6974 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 21 Mar 2022 00:11:08 -0400 Subject: [PATCH 2/3] Add tests --- .../AvaloniaObjectTests_Binding.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs index 7c4c5c96a5..d4e14d00b8 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs @@ -829,6 +829,30 @@ namespace Avalonia.Base.UnitTests subscription.Dispose(); } + [Fact] + public void TwoWay_Binding_Should_Not_Call_Setter_On_Creation_With_Value() + { + var target = new Class1(); + var source = new TestTwoWayBindingViewModel() { Value = 1 }; + source.ResetSetterCalled(); + + target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value), BindingMode.TwoWay) { Source = source }); + + Assert.False(source.SetterCalled); + } + + [Fact] + public void TwoWay_Binding_Should_Not_Call_Setter_On_Creation_Indexer_With_Value() + { + var target = new Class1(); + var source = new TestTwoWayBindingViewModel() { [0] = 1 }; + source.ResetSetterCalled(); + + target.Bind(Class1.DoubleValueProperty, new Binding("[0]", BindingMode.TwoWay) { Source = source }); + + Assert.False(source.SetterCalled); + } + /// /// Returns an observable that returns a single value but does not complete. /// @@ -943,6 +967,11 @@ namespace Avalonia.Base.UnitTests } public bool SetterCalled { get; private set; } + + public void ResetSetterCalled() + { + SetterCalled = false; + } } } } From 6a5bd396cbecf8ed5e8a07cc8827334384e338b4 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 21 Mar 2022 00:18:52 -0400 Subject: [PATCH 3/3] Rename fields --- src/Avalonia.Base/Data/BindingOperations.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Base/Data/BindingOperations.cs b/src/Avalonia.Base/Data/BindingOperations.cs index 0c38f78c83..4e47a720f0 100644 --- a/src/Avalonia.Base/Data/BindingOperations.cs +++ b/src/Avalonia.Base/Data/BindingOperations.cs @@ -99,14 +99,15 @@ namespace Avalonia.Data private sealed class TwoWayBindingDisposable : IDisposable { - private readonly IDisposable _first; - private readonly IDisposable _second; + private readonly IDisposable _toTargetSubscription; + private readonly IDisposable _fromTargetSubsription; + private bool _isDisposed; - public TwoWayBindingDisposable(IDisposable first, IDisposable second) + public TwoWayBindingDisposable(IDisposable toTargetSubscription, IDisposable fromTargetSubsription) { - _first = first; - _second = second; + _toTargetSubscription = toTargetSubscription; + _fromTargetSubsription = fromTargetSubsription; } public void Dispose() @@ -116,8 +117,8 @@ namespace Avalonia.Data return; } - _second.Dispose(); - _first.Dispose(); + _fromTargetSubsription.Dispose(); + _toTargetSubscription.Dispose(); _isDisposed = true; }