最近、MVVMLight 3 から 4 にアップグレードしたところ、コマンドが壊れていることに気付きました。新しい RelayCommand (バージョン 3.5 で実装) で弱い参照を使用すると、使用しているコード構成が失敗する原因になっていることが判明しました。メモリリークに関連する弱い参照についていくつかの議論があることは知っていますが、それを理解していません。
これは失敗します:
private void InitCommand()
{
Command = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this).Command;
}
失敗とは、初期化してバインドした Command プロパティを使用しようとすると、そのバッキング メソッドがガベージ コレクションされ、Command の実行に失敗することを意味します。興味深いことに、Command オブジェクトはまだ存在し、SwitchMainGridCommand のサポート プロパティだけがなくなりました。RelayCommand の弱い参照の前は、SwitchMainGridCommand が明示的に保持されていなかったとしても、Command への参照はサポート プロパティも利用できるようにしていました。
これは成功します:
SwitchMainGridCommand<SwitchMainGridToolViewModel> _refHolder = null;
private void InitCommand()
{
_refHolder = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this);
Command = _refHolder.Command;
}
Command が割り当てられている ViewModel で _refHolder クラス変数を作成すると、_refHolder.Command が参照するメソッド/プロパティが収集されなくなります。
これは弱い参照の望ましい動作だと思いますが、なぜそれが望ましいのかわかりません。