MVVM Foundation:ViewModelからアプリケーションウィンドウを閉じる方法
-
05-10-2019 - |
質問
使ってます MVVM Foundation しかし、私はそれが非常に簡単であり、実際にはフレームワークに固有ではないと思います。私のセットアップは次のとおりです。
startViewModel-リレーコマンド/icommandを返すexitcommandがあります
public ICommand ExitCommand { get { return _exitCommand ?? (_exitCommand = new RelayCommand(() => MessageBox.Show("Hello World"))); } } public RelayCommand _exitCommand;
StartView(ユーザーコントロール)には、exitcommandにバインドされたボタンがあります
<Button Content="Exit" Command="{Binding ExitCommand}" />
解決
まず、MVVMでお腹を空けることができる限り読んでください。 Model-View-ViewModelデザインパターンを備えたWPFアプリ MSDNで。それを推進する基本原則を理解すると、答えはより合理的に思えます。
基本的に、あなたはあなたのビュー(UI)とViewModel(本質的に抽象的なUIだけでなく、抽象モデル)レイヤーを維持したい 分ける そして分離されました。メッセージボックスを表示したり、ウィンドウを閉じたりすることは、UI固有の詳細と見なされるため、ビューに実装される必要があります。または、より一般的には「サービス」を介して利用可能なメッセージボックスの場合に実装する必要があります。
ViewModelに関して、これは 制御の反転 (IOC)。上記のメッセージボックスの例を取ります。メッセージボックス自体を表示するのではなく、showメソッドを備えたimessageboxserviceと、代わりに責任を委任するViewmodelコールに依存します。これは、活用によってさらに取られる可能性があります 依存関係インジェクション (DI)コンテナ。
ビューウィンドウを閉じるために使用される別のアプローチは、ViewModelが(MSDN記事のように)requestCloseと呼ばれるイベントを公開することです。その後、ViewModelは、対応するビュー /ウィンドウを閉じる必要がある場合にイベントを上げます。それは他の何かが聞いていると想定しており、責任を負い、実際にそれを行います。
他のヒント
StartViewModelにCloseEventを実装できます。 StartViewでは、このCloseEventを登録する必要があります。 VMから近接しているとき、あなたの見解は、それがあなたのアプリ/ウィンドウを閉じる必要があることを認識します。