From 06a4a1af5ba992355441c4440af75b3e30b72160 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sun, 15 Sep 2019 01:29:17 +0200 Subject: [PATCH 1/3] Add failing unit test. --- .../WeakEventHandlerManagerTests.cs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs b/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs index 9ed6590821..81b882308d 100644 --- a/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs +++ b/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs @@ -36,7 +36,7 @@ namespace Avalonia.Base.UnitTests } [Fact] - public void EventShoudBePassedToSubscriber() + public void EventShouldBePassedToSubscriber() { bool handled = false; var subscriber = new Subscriber(() => handled = true); @@ -47,7 +47,23 @@ namespace Avalonia.Base.UnitTests Assert.True(handled); } - + [Fact] + public void EventShouldNotBeRaisedAfterUnsubscribe() + { + bool handled = false; + var subscriber = new Subscriber(() => handled = true); + var source = new EventSource(); + WeakEventHandlerManager.Subscribe(source, "Event", + subscriber.OnEvent); + + WeakEventHandlerManager.Unsubscribe(source, "Event", + subscriber.OnEvent); + + source.Fire(); + + Assert.False(handled); + } + [Fact] public void EventHandlerShouldNotBeKeptAlive() { From 3030427c07d3d38c869a42aab0ad44e64b7dcc18 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sun, 15 Sep 2019 01:33:32 +0200 Subject: [PATCH 2/3] Fix unsubscribe not doing anything due to wrong check. --- src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs b/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs index b59ed166bc..607e2a147b 100644 --- a/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs +++ b/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs @@ -161,9 +161,8 @@ namespace Avalonia.Utilities for (int c = 0; c < _count; ++c) { var reference = _data[c].Subscriber; - TSubscriber instance; - if (reference != null && reference.TryGetTarget(out instance) && instance == s) + if (reference != null && reference.TryGetTarget(out TSubscriber instance) && instance == (TSubscriber)s.Target) { _data[c] = default; removed = true; From 213600f6c23b247d561727963face70b23d7fec3 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Sun, 15 Sep 2019 01:47:04 +0200 Subject: [PATCH 3/3] Use Equals. --- src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs b/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs index 607e2a147b..f4cec98628 100644 --- a/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs +++ b/src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs @@ -162,7 +162,7 @@ namespace Avalonia.Utilities { var reference = _data[c].Subscriber; - if (reference != null && reference.TryGetTarget(out TSubscriber instance) && instance == (TSubscriber)s.Target) + if (reference != null && reference.TryGetTarget(out TSubscriber instance) && Equals(instance, s.Target)) { _data[c] = default; removed = true;