C#プログラミング

【C#】MVVMでViewModelからウィンドを閉じる方法

MVVMでVMからウィンドを閉じる方法記事 C#

C#のMVVMにおけるViewModelからウィンドを閉じる方法をサンプルコードで紹介します。基本的にはウィンドそのものを閉じればよいのですが、特定の処理が終わったら閉じるような機能を実装する際には必要となると思い調べました。

スポンサーリンク

ViewModel(VM)からウィンドを閉じる方法の使い道

通常ウィンドを閉じるには、ウィンド右上の「X(バツ)」をクリックして閉じると思います。実際9割以上の用途ではそれで十分でしょう。

ViewModelからウィンドを閉じる機能が役に立つケースは以下が考えられます。


  • 特定の処理が終了したらウィンドを閉じるケース
  • 一時的に使用するサブウィンドを閉じるケース

設定用サブウィンドを表示して、その中の「設定完了」的なボタンを押すとウィンドが閉じるといった使い道あたりが実用上ありそうです。

スポンサーリンク

サンプルコード

以下のようなサンプルアプリを作成しました。
ボタンを押したらウィンドが閉じます。

サンプルアプリの見た目
閉じるボタンのみ配置

MVVM形式で記載しています。MVVMについては、こちらの記事を参照。

View

XAMLは以下の通り。特に工夫なし。

<Grid>
    <StackPanel Orientation="Vertical" >
        <Button Content="Close Window" Command="{Binding WindowCloseBtn_Pushed}" Margin="50"/>
    </StackPanel>
</Grid>

コードビハインドは以下の通り。
VMで定義したActionにウィンドを閉じる処理を格納します。

namespace CloseWindowfromVM.Views
{
    public partial class MainWindow : Window
    {
        MainViewModel vm = new MainViewModel();
        
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = vm;

            //VMからウィンドを閉じる用
            if (vm.CloseWindowAction == null)
                //VMのActionにClose処理を代入
                vm.CloseWindowAction = new Action (this.Close);
        }
    }
}

ViewModel

ポイントは以下です。

  • Actionプロパティを定義。
  • ボタンを押した際に呼ばれるコマンドの処理において、Actionを呼び出し。
namespace CloseWindowfromVM.ViewModels
{
    internal class MainViewModel : INotifyPropertyChanged
    {
        //ウィンドを閉じる用Action
        public Action CloseWindowAction { get; set; }

        //コマンド
        public ICommand WindowCloseBtn_Pushed { get; set; }


        public MainViewModel()
        {
            //コマンド
            WindowCloseBtn_Pushed = new RelayCommand(WindowClose_Command);
        }

        

        //コマンド(ウィンドを閉じるActionの実行)
        private void WindowClose_Command()
        {
            CloseWindowAction();
        }

        //変数の更新通知用
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
}
スポンサーリンク

さいごに

コードビハインドに少し記載する方法ですが、コンストラクタ内でコード量もわずかなのでこれでいいかなと思っています。

MVVMはVMから見た目の変化を起こす際に考えさせられることが多いですね。

コメント

タイトルとURLをコピーしました