1
0
mirror of https://github.com/chylex/.NET-Community-Toolkit.git synced 2025-04-13 20:15:45 +02:00

Fix register/unregister issues of WeakReferenceMessenger

This commit is contained in:
Stefan Steinhilber 2021-06-21 11:32:38 +02:00
parent 20ad4e505b
commit 1030a20fac
2 changed files with 26 additions and 1 deletions
Microsoft.Toolkit.Mvvm/Messaging
UnitTests/UnitTests.Shared/Mvvm

View File

@ -406,6 +406,8 @@ public bool MoveNext()
while (node is not null)
{
LinkedListNode<WeakReference<TKey>>? 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;

View File

@ -511,6 +511,29 @@ void Test()
messenger.Cleanup();
}
[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 handlerCalledCount = 0;
messenger.Register<object, MessageA>(recipient1, (r, m) => { handlerCalledCount++; });
messenger.Register<object, MessageA>(recipient2, (r, m) => { handlerCalledCount++; });
messenger.UnregisterAll(recipient2);
messenger.Send(new MessageA());
Assert.AreEqual(1, handlerCalledCount);
}
public sealed class RecipientWithNoMessages
{
public int Number { get; set; }