1

Registerメソッドの特徴は次のとおりです。

IMessanger.Register<TMsg>(object recipient, Action<TMsg> action);

アクションがそのTargetプロパティに参照を保持している場合、なぜ受信者が必要なのですか?指定されたアクションが、それが定義されたクラスのインスタンスメンバーを使用しない場合、Targetはnullになります。
しかし、これはめったに起こりません。つまり、イベントハンドラーを使用する方法はあまり一般的ではありません。

Register受信者パラメータのない追加のメソッドシグネチャがない理由を理解したいのですが?重要なものが欠けていますか?

IMessanger.Register<TMsg>(Action<TMsg> action);
4

2 に答える 2

2

実際には、受信者であるクラスだけでなく、アプリケーションのどこからでも特定のメッセージの受信者を登録できます。たとえば、次のシナリオについて考えてみます。

public class ClassA : ViewModelBase
{
    public ClassA()
    {
         Messenger.Default.Register<SomeMessage>(this, SomeAction);
         Messenger.Default.Register<SomeMessage>(ViewModelLocator.ClassB, SomeAction);
    }

    private void SomeAction(SomeMessage msg)
    {
        // do something
    }
}

public class ClassB : ViewModelBase
{
    public ClassB()
    {

    }
}

2番目のRegistorメソッド呼び出しの場合、アクションのTargetプロパティは受信者パラメーターと同じではありません。したがって、一貫性を保つために、常に受信者パラメータを要求する方が安全である可能性が最も高いです。

もちろん、このシナリオは、単にthis受信者として渡すシナリオよりもおそらく一般的ではないというのは正しいことです。したがって、その場合、入力thisが煩わしい場合は、Targetプロパティを実際のメソッドRegisterに渡すだけの独自の拡張メソッドをいつでも定義できます。Register

public static class MessengerHelper
{
    public static void Register<TMessage>(this IMessenger messenger, Action<TMessage> action)
    {
        messenger.Register<TMessage>(action.Target, action);
    }
}

次に、次のようなメッセージに登録できます。

public class ClassA : ViewModelBase
{
    public ClassA()
    {
         Messenger.Default.Register<SomeMessage>(SomeAction);
    }

    private void SomeAction(SomeMessage msg)
    {
        // do something
    }
}
于 2012-11-20T15:46:29.943 に答える
0

Messenger.UnregisterRecepient(recepient);これは、このレシーバーに登録されているすべてのアクションのサブスクライブを解除するかどうかを判断できるようにするために行われます。

于 2012-11-20T15:26:49.707 に答える