2017-04-23 11 views
0

メッセージがViewのコンストラクタに登録されたときに複数回登録されているため、Messageが複数回発生する問題が発生しました。 S.O.投稿、ウェブサイト、ブログには次のような例が表示されます:MvvmLight Messaging - メッセージを登録および登録解除する適切な方法は何ですか?

public ConstructorOfView() { 
    DataContext = viewModelObject; 
    Messenger.Default.Register<SomeClass>(recipient, token, method); 
} 

public someUnloadOrNavigateFromMethod() { 
    Messenger.Default.Unregister<SomeClass>(parameters and more); 
} 

登録解除は私にとっては効果がないようです。いくつかの例では、ViewModel内にメッセージを登録すると言います。これは2つの理由から私には意味をなさない:1)ページのDataContextをViewModelに設定すると、ViewModelコンストラクタはビューコンストラクタと同じように2回呼び出される。 2)ViewModelの中にメッセージを登録した場合、メソッドを起動するためにビューをどのくらい正確に宣言しますか? viewmodel内のダイアログのようなUI関連の要素を呼び出す3番目のオプションは、MvvMの概念に違反しているようです。

メッセージを登録および登録解除する適切な方法は何ですか?

投稿の中には、Cleanup()を呼び出すことをお勧めしているものもありますが、どういうわけかメッセージをviewmodelに登録する必要がありますが、メッセージの受信者をviewmodelとして設定すると、ビューで非公開静的メソッドを呼び出して、UIを変更/表示しますか?

答えて

0

私は通常、自分のビューモデルがIOCコンテナに登録されている(MVVMLightスターターアプリケーションのVireModelLocatorクラスを見てください)、ViewModelコンストラクターにメッセージを登録するパターンを使用します。

このように、ViewModelの作成はIOCによって処理されるため、関連するビューの複数の作成に問題はなく、メッセージの登録は一度しか行われません。

メッセージを登録したり解除したりすると、メッセージを送信するバグを見つけにくいが、何らかの理由でジェットハンドラーが登録されていないバグが発生する場合があります。

また、99%のビュー/ビューモデルのやりとりが必要になると付け加えます。

プログラミングパターンを識別して理解するために、MvvmLightが提供するWPFアプリケーションテンプレートを確認することを強くお勧めします。

+0

返信いただきありがとうございます。一つは私が混乱している。 viewmodelにメッセージを登録すると、ダイアログボックスをviewmodelではなくviewで処理する必要がある場合、ダイアログボックスのようなUIをどのように変更または表示するのですか?それは、ビューモデルの中にメッセージを登録することに関して私にとって意味をなさないものです。 – ShrimpCrackers

+0

私はあなたの疑いを理解しています、何とかそれに同意します。ファクトは、そのための多くのソリューションであり、コードを記述しているプラ​​ットフォームにも基づいています。あなたがWindows用のwpfアプリケーションを書いていることを前提にすると、最初のものは:mvvmの過激派ではなく、メッセージハンドラのMessageBox.Showを直接呼び出すことです。私は時々これを行う、それは動作し、それはいくつかのMVVMの原則に違反しますが、コードの何百もの行を保存する可能性があります。第2の方法:ユーザーにメッセージを表示し、メッセージを表示するためにUIコントロールにバインドする方法を再考してください。三番目:ダイアログボックスの代わりに新しいポップアップビューが表示されます。 –

関連する問題