diff --git a/src/Avalonia.Base/Data/BindingOperations.cs b/src/Avalonia.Base/Data/BindingOperations.cs index 5353e8175d..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; } - _first.Dispose(); - _second.Dispose(); + _fromTargetSubsription.Dispose(); + _toTargetSubscription.Dispose(); _isDisposed = true; } 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; + } } } }