この記事は何か
WPFでアプリを作っている。
ViewModelからWindowを閉じる方法を探したが、どれもピンと来なかった。
いろいろな記事から良いとこ取りをした、自分なりの結論(方法)を書く。
(想定)
- Window1.xamlにボタンが1つ配置されている。
- そのボタンをクリックすると、Windowが閉じる。
View
ボタンの親Windowを探して、それを引数にCloseWindow
を実行する。
CloseWindow
は後述のViewModelに実装する。
<Button Command="{Binding CloseWindow}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Content="Close" />
#ViewModel
ReactiveProperty
でコマンドを宣言し、コンストラクタ内に処理の内容を書く。
System.Windows.Window
で安直にキャストして.Close()
しているけど、
本当はちゃんとnull
チェックとかした方がいい。
// プロパティ宣言
public ReactiveCommand CloseWindow { get; } = new ReactiveCommand();
// コンストラクタ内
CloseWindow.Subscribe(x => ((System.Windows.Window)x).Close());
#使い道
ウィンドウ内の OK/キャンセル ボタンを押して
すぐにウィンドウを閉じるのではなく
確認ダイヤログを表示してからウィンドウを閉じたい場合。
<Button Command="{Binding OK}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Content="OKボタン" />
// コンストラクタ内
OK.Subscribe(x => {
result = MessageBox.Show("ウィンドウを閉じてもよろしいですか?", "確認メッセージ", MessageBoxButtons.OKCancel);
if (result == DialogResult.Cancel)
return;
else
CloseWindow.Execute(x);
});
#最後に
きっと、もっといい方法があると信じている
#参考
xamlだけでウィンドウを閉じる処理を実装 (www.neko3cs.net 様)
#追記2020.08.17
コメントいただき、TriggerActionでググったら、あっという間に正解にたどり着きました。
MVVMでウインドウを閉じる - Qiita
もっとちゃんと検索してから記事を書きます。
ありがとうございました。
#追記2020.08.27
コメントで関連動画を紹介いただきました。ありがとうございます。
YouTubeの動画 (イントロを飛ばして開始120秒から再生)