2011-09-16 20 views
1

私はMVVMLightを使用しており、コミュニケーションの仕組みを試してみるために少し習得しています。私は、PropertiesがSilverlightバインディングとどのように連携するかを理解しています。それはまったく単純です。MVVMLightからコマンドを送信

ここで私が知りたいのは、メッセージをコマンドとして送信するための最良の方法です。したがって、たとえば、ViewModelにそのリストを消去するメッセージを送信したいとします。

は、だから私は、コマンド

enum MessageOp 
{ 
    Reset 
} 

しかし、その後どのように私は、コマンドとしてこれを送ることができるとして機能するように列挙型を作成することができますか?現時点ではクラスとして送信しますが、それをトークンとして再度送信する必要があります。これと同様にこのようなViewModelにでは私のコードでは

Messenger.Default.Send<MessageOp>(MessageOp.Reset, MessageOp.Reset); 

:私はコマンドとして機能するように、完全に空のクラスを作成していたと考え

Messenger.Default.Register<MessageOp>(
    this, MessageOp.Reset, 
    delegate(MessageOp op) 
    { 
     // Erase all entries 
     MyDictionary.Clear(); 
    }); 

一つの方法。私はこの

+0

あなたのニーズに合った答えがありましたか? – AxelEckenberger

答えて

5

あなたがachiveしようとするものは非常にわからないように行動するために、空のクラスを作成する少し奇妙に感じるが、私はあなたが別のビューからのメッセージを送りたいと思いますので、これは最良の方法だろう。この場合、

Messenger.Send(Message.Reset); 

を送信してください。受信側では、次のコードを使用します。

非常に重要:メッセージングを使用する場合は、必ずメッセンジャーから受信者を削除してください。ビューモデルの場合、ビューモデルでクリーンアップを呼び出すことでこれを行うことができます。それ以外の場合は、Messenger.Unregister(受信者)を使用します。これは、MVVM Lightの弱いアクションの実装には、受信者を単独でリリースする既知の問題があるため、必要です。

しかし、コマンドにボタン(または同様のもの)をバインドしたければ、RelayCommandを使用します。

ビューモデルに次の定義を追加します。

public RelayCommand ResetCommand { 
    get { 
     return _resetCommand ?? (_resetCommand = new RelayCommand(
      () => { 
       // your execution code 
      }, 
      () => { 
       // can execute - gets called quite often! 
      ) 
     )); 
    } 
} 
private RelayCommand _resetCommand; 

次に、あなたがボタンにこのコマンドをバインドすることができ

<button Content="Reset" Command="{Binding ResetCommand}"/> 

編集

を特定するメッセージを送信するには実際には2つの可能性があります:

  1. メッセージを送信するときにトークンを追加します。
  2. 受信者だけが購読するカスタムメッセージを作成します。

個人的には、私は第2のアプローチがより明確で明示的であるため、より保守的であるため、個人的にはアプローチしたいと思います。だから、あなたは次の操作を実行できるカスタムメッセージを作成するには:

public class OperationMessage : GenericMessage<MessageOp> { 
    public OperationMessage(MessageOp operation) : base(operation) { } 
} 

public class ResetMessage : OperationMessage 
{ 
    public ResetMessage() : base(MessageOp.Reset) { } 
} 

今、あなたは

Messenger.Send(new ResetMessage()); 

を送信し、

Messenger.Register<ResetMessage>(this, (m) => { 
    // do your resetting here 
}); 

または

Messenger.Register<OperationMessage>(this, true, (m) => { 
    // handle all operations here - the operation is avaiable via m.Content 
}); 

理由を受け取ることができますなぜ私はOperationMessageを作成するのですか?それはmoです必要に応じて、一般的または具体的に操作を処理することができます。

+0

それは私が探していたものではありませんが、それほど有用な情報ではありません。私が望んでいたのは、メッセージを送信して特定のターゲットに確実に届くようにすることでした。それについてもっと考えてみましょう。文字列ターゲットを使用して、そのトークンに対して受け取って登録したいものの名前を付けることができました。 'Messenger.Default.Send (MessageOp.Reset、" PeopleViewModel ");' 1つの小さなこと、どの点で1つのクリーンアップが必要なのか?これはデストラクタや他のポイントですか? – Firedragon

+0

@Firedragon編集を参照してください...これはあなたの問題を解決することを願っています。 OPの中でより具体的になると助けになりました... ;-) – AxelEckenberger

+0

ありがとうございました。私が十分に具体的でない場合は申し訳ありません。私が仕事でやっていることを完全に説明していないような言葉で質問をしようとすると、挑戦が証明されています.-最後に、クリーンアップをどの段階で行うべきかをもう少し説明してください(明らかに、私はすべてのC + +を一瞬行った) – Firedragon

関連する問題