イベントを使用してこれを行うこともできます。ビューコードビハインドには3行のコードが必要ですが(一部のMVVM純粋主義者はこれを嫌います)。
ビューモデルで、ビューがサブスクライブできるイベントを作成します。
public event CloseEventHandler Closing;
public delegate void CloseEventHandler();
private void RaiseClose()
{
if (Closing != null)
Closing();
}
で、次のように、initializecomponentメソッドの後にイベントをサブスクライブするビューを表示します。
public View
{
*//The event can be put in an interface to avoid direct dependence of the view on the viewmodel. So below becomes
//ICloseView model = (ICloseView)this.DataContext;*
ProgressWindowViewModel model = (ProgressWindowViewModel)this.DataContext;
model.Closing += Model_Closing;
}
private void Model_Closing()
{
this.Close();
}
ViewModelからビューを閉じる準備ができたら、RaiseClose()を呼び出すだけです。
このメソッドを使用して、ビューモデルからビューにメッセージを送信することもできます。
ビューをビューモデルに直接依存させないように、イベントをインターフェイスに配置できます。