diff --git a/src/Avalonia.Base/Data/Core/ExpressionNode.cs b/src/Avalonia.Base/Data/Core/ExpressionNode.cs index f2f3ed9bfc..8a2dd46b86 100644 --- a/src/Avalonia.Base/Data/Core/ExpressionNode.cs +++ b/src/Avalonia.Base/Data/Core/ExpressionNode.cs @@ -147,6 +147,7 @@ namespace Avalonia.Data.Core private void StopListening() { StopListeningCore(); + _listening = false; } private BindingNotification TargetNullNotification() diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs index c90683959e..f282d1baf3 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/ExpressionObserverTests_Property.cs @@ -563,6 +563,19 @@ namespace Avalonia.Base.UnitTests.Data.Core Assert.Null(result.Item2.Target); } + [Fact] + public void Should_Not_Throw_Exception_On_Unsubscribe_When_Already_Unsubscribed() + { + var source = new Class1 { Foo = "foo" }; + var target = new PropertyAccessorNode("Foo", false); + Assert.NotNull(target); + target.Target = new WeakReference(source); + target.Subscribe(_ => { }); + target.Unsubscribe(); + target.Unsubscribe(); + Assert.True(true); + } + private interface INext { int PropertyChangedSubscriptionCount { get; }