私のプロジェクトでは奇妙な動作があります。私はMvvmLightメッセンジャーを使用してUIのさまざまな部分を更新するように通知します。mvvmlight messenger strange behavior
public EntryViewModel(MenuViewModel menuVM, Entry item)
{
this._menuVM = menuVM;
OpenDetailsCommand = new RelayCommand(OpenDetailsInMainWindow);
BackCommand = new RelayCommand(Back);
this._entry = item;
Refresh();
Messenger.Default.Register<CardUpdateMessage>(this, this._entry.Id, msg => Refresh(););
}
と
Messenger.Default.Send(new CardUpdateMessage(id), id);
私が登録した後、メッセンジャーの内容を見ると、それはCardUpdateMessageの約400に登録されたアクションが含まれていますが、私はそれら火災のどれを送信しない呼び出すときに送信します。 ところで、メッセージタイプごとに単一の登録オブジェクトを持つ類似のコードは、私が期待するように動作します。この問題の原因は何ですか?
更新:私は、デバッガでいくつかの研究を行い、ファイルhttps://mvvmlight.codeplex.com/SourceControl/latest#GalaSoft.MvvmLight/GalaSoft.MvvmLightに(PCL)/Messaging/Messenger.cs方法SendToListが発射され、その内側のループWeakActionに解雇されていますが、Refreshメソッドが実行されていないことを発見しました。 WeakActionで疑いのないことがありますか?
解決策:この問題のケースを発見しました。予期せぬ動作のためにMessenger.Registerで匿名関数を使用することはできません。 だけMessenger.Default.Register(this, this._entry.Id, Refresh);
と private void Refresh(CardUpdateMessage msg) ...
外部参照:https://mvvmlight.codeplex.com/workitem/7640
あなたが解決策を見つけたらうれしいですが、それをあなたの質問に編集すべきではありません。あなたが見つけたものを下に答えを加え、必要な待ち時間の後に正しいものを選択してこれを閉じることができます。それは奇妙に見えるかもしれませんが、それがここで私たちがやる方法です。 – Will
@大丈夫、私は自分の答えを書いています – Anton