diff --git a/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs b/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs index 3f79f237373..19e14497b39 100644 --- a/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs +++ b/Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs @@ -406,6 +406,8 @@ public bool MoveNext() while (node is not null) { + LinkedListNode>? nextNode = node.Next; + // Get the key and value for the current node if (node.Value.TryGetTarget(out TKey? target) && this.owner.table.TryGetValue(target!, out TValue? value)) @@ -421,7 +423,7 @@ public bool MoveNext() this.owner.keys.Remove(node); } - node = node.Next; + node = nextNode; } return false; diff --git a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs index e5b4fd00fad..1ccc27af67d 100644 --- a/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs +++ b/UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs @@ -511,6 +511,32 @@ void Test() messenger.Cleanup(); } + // See https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/4081 + [TestCategory("Mvvm")] + [TestMethod] + [DataRow(typeof(StrongReferenceMessenger))] + [DataRow(typeof(WeakReferenceMessenger))] + public void Test_Messenger_RegisterMultiple_UnregisterSingle(Type type) + { + var messenger = (IMessenger)Activator.CreateInstance(type); + + var recipient1 = new object(); + var recipient2 = new object(); + + int handler1CalledCount = 0; + int handler2CalledCount = 0; + + messenger.Register(recipient1, (r, m) => { handler1CalledCount++; }); + messenger.Register(recipient2, (r, m) => { handler2CalledCount++; }); + + messenger.UnregisterAll(recipient2); + + messenger.Send(new MessageA()); + + Assert.AreEqual(1, handler1CalledCount); + Assert.AreEqual(0, handler2CalledCount); + } + public sealed class RecipientWithNoMessages { public int Number { get; set; } @@ -550,4 +576,4 @@ public sealed class MessageB { } } -} \ No newline at end of file +}