0

I've been trying to implement WeakReferenceMessenger to send messages in my Xamarin app. I've successfully used it to send messages to an async callback using the following...

Message class:

public class MyMessage : CollectionRequestMessage<Task>
{
    public MyMessage() { }
}

Register command:

WeakReferenceMessenger.Default.Register<MyMessage>(this, MyCallbackAsync);

Send command:

WeakReferenceMessenger.Default.Send(typeof(MyMessage));

And extending IMessengerExtensions:

public static partial class IMessengerExtensions
{
    public static void Register<T>(this IMessenger messenger, object recipient, Func<Task> asyncAction) where T : CollectionRequestMessage<Task>
    {
        messenger.Register<T>(recipient, (r, m) =>
        {
            var task = asyncAction();
            m.Reply(task);
        });
    }
}

I've also sent messages with values to non-async callbacks as follows...

Message class:

public class MyMessageWithString : ValueChangedMessage<string>
{
    public MyMessageWithString(string value) : base(value) { }
}

Register command:

WeakReferenceMessenger.Default.Register<MyMessageWithString>(this, (r, m) => MyCallbackWithString(m.Value));

Send command:

var instance = Activator.CreateInstance(typeof(MyMessageWithString), new object[] { "Hello world" }) as MyMessageWithString;

WeakReferenceMessenger.Default.Send(instance);

Unfortunately, I also need to send a message with a value to an async callback but I can't see how to pass a value using CollectionRequestMessage (it doesn't seem to expose a Value property as ValueChangedMessage does). Can anyone suggest how this can be done?

bcl
  • 478
  • 1
  • 5
  • 16

1 Answers1

1

Unfortunately, I also need to send a message with a value to an async callback but I can't see how to pass a value using CollectionRequestMessage (it doesn't seem to expose a Value property as ValueChangedMessage does). Can anyone suggest how this can be done?

About async callback, you can use the Callback method of the Moq framework and refer to this case: Moq callback for ReturnsAsync.