diff --git a/src/Perspex.Base/PriorityLevel.cs b/src/Perspex.Base/PriorityLevel.cs index b7ffcce971..3c47199525 100644 --- a/src/Perspex.Base/PriorityLevel.cs +++ b/src/Perspex.Base/PriorityLevel.cs @@ -140,6 +140,7 @@ namespace Perspex return Disposable.Create(() => { Bindings.Remove(node); + entry.Dispose(); if (entry.Index >= ActiveBindingIndex) { diff --git a/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs b/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs index 40f542ae76..caa36f38a8 100644 --- a/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs +++ b/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs @@ -4,6 +4,7 @@ using System; using System.Reactive.Linq; using System.Reactive.Subjects; +using Microsoft.Reactive.Testing; using Perspex.Data; using Xunit; @@ -81,6 +82,22 @@ namespace Perspex.Base.UnitTests Assert.Equal("foodefault", target.GetValue(Class1.FooProperty)); } + [Fact] + public void Observable_Is_Unsubscribed_When_Subscription_Disposed() + { + var scheduler = new TestScheduler(); + var source = scheduler.CreateColdObservable(); + var target = new Class1(); + + var subscription = target.Bind(Class1.FooProperty, source); + Assert.Equal(1, source.Subscriptions.Count); + Assert.Equal(Subscription.Infinite, source.Subscriptions[0].Unsubscribe); + + subscription.Dispose(); + Assert.Equal(1, source.Subscriptions.Count); + Assert.Equal(0, source.Subscriptions[0].Unsubscribe); + } + [Fact] public void Two_Way_Separate_Binding_Works() { diff --git a/tests/Perspex.Base.UnitTests/packages.config b/tests/Perspex.Base.UnitTests/packages.config index 3047aefeea..164dada787 100644 --- a/tests/Perspex.Base.UnitTests/packages.config +++ b/tests/Perspex.Base.UnitTests/packages.config @@ -3,6 +3,9 @@ + + +