MVVM Lightを使い始める前に、「新しい」ICleanupインターフェイスを見つけました。私はいつVMをクリーンアップするのだろうと思っていました...あなたはページから離れて移動しますか?MVVM LightでViewModelを廃棄する場合
また、ViewModelLocatorには、すべてのVMをクリーンアップする必要があるメインクリーンアップがあります。これはいつ使用されますか?
どうもありがとうございました
よろしく、 マウロ
MVVM Lightを使い始める前に、「新しい」ICleanupインターフェイスを見つけました。私はいつVMをクリーンアップするのだろうと思っていました...あなたはページから離れて移動しますか?MVVM LightでViewModelを廃棄する場合
また、ViewModelLocatorには、すべてのVMをクリーンアップする必要があるメインクリーンアップがあります。これはいつ使用されますか?
どうもありがとうございました
よろしく、 マウロ
IDispose
実装超えるICleanup
インターフェースの利点は、(それが以前あった)である - ローランは、それを述べて - あなたはより頻繁にそれを呼び出すことができるということと、 VMを廃棄済みとしてマーキングする必要はありません。つまり、VMのメッセージ処理を登録/解除する必要がある場合はいつでも、ICleanup.Cleanup
に電話する必要があります。明らかにこの場合は、後で必要になったときにすべてのメッセージハンドラを再度登録するメソッドが必要です。
個人的には、私は特に、IOCコンテナに傾いているので、VMクリーンアップを扱うより多くの友人です。しかし、私はLaurentのケースを見ることができ、を呼び出すことで、VM上でCleanup
を呼び出すのは面倒なことではありません。
一般に、VMの廃棄/クリーンアップが行われる時点は、そのインスタンス化方法とオブジェクトの有効期間によって異なります。これらの決定は、あなたの申請書の作成に支配されており、の場合にはへの明確な指針はありません。しかし、にはがあります。これは、ビューモデル内にメッセージハンドラを登録するたびに実行する必要があります。それ以外の場合は厳密には必要ありません。
メッセージハンドラについては、メッセージハンドラを登録したときに、メッセージハンドラのビューを登録解除することも忘れないでください(this post参照)。 - 2番目の考えでは、ここにコードを明記して、後で参照できるようにします:
コードビハインドファイルのビューのコンストラクタで、次のコードを追加して、ビューのときに登録されたメッセージハンドラが解放されるようにしますアンロードされました:
public MyView() {
this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}
返信ありがとうございます。私は今メッセンジャーの後に掃除の全体のコンセプトを理解しています – Mauro
私は、メッセンジャーがWeakReferenceを使用していたという事実は、登録解除が必要ではなく、クリーンアップ以外の理由で登録を解除すると考えていました。 –
@RalphShillington:それはしなければならないが、そうではない。これは既知の問題です。ハンドラを登録するときに、参照を保持させる関数です。この理由は、匿名関数や静的関数の場合、関数への弱い参照が機能しないからです。 Laurent、他の人たち、そして私はこれを調べました。最高のアドバイスは...登録を解除することです! – AxelEckenberger