programming

C# Tech

【C#+WPF+Prism】ClickイベントをViewModelで受ける方法

2022年6月5日

今回はC#+WPF+Prismを用いる時に、ClickイベントをViewModel側にどう通知するのかを紹介したいと思います。

やりたいこと

この画面から

 クリックすると、「Clicked」のMessageBoxが表示される。

フォルダ構成

ViewにButtonのアクション関数をバインド

<Window x:Class="Sample.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <Grid>
        <StackPanel>
            <Button Command="{Binding ClickCommand}" Height="50" Width="100" Content="Click Here" Margin="0,0,0,10" Click=""/>
        </StackPanel>
    </Grid>
</Window>

肝となるところは、ButtonCommand="{Binding ClickCommand}"の箇所。

通常、Prismを利用しない場合だと、Click="Click_Button"といった書き方で、さらにMainWindow.csにそのアクション関数を定義します。

しかし、PrismではMVVMの思想に基づいて、ViewModelにその定義をするので、通常とは異なる記述の仕方になっています。

ViewModelでアクション関数を定義


using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Windows;

namespace Sample.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism Application";
        public DelegateCommand ClickCommand { get; set; }
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }
        public MainWindowViewModel()
        {
            ClickCommand = new DelegateCommand(OnClick);
        }

        private void OnClick()
        {
            MessageBox.Show("Clicked");
        }
    }
}

まず、DelegateCommandを定義します。

public DelegateCommand ClickCommand { get; set; }

次に、その定義したCommandとアクション関数を紐づけます。

ClickCommand = new DelegateCommand(OnClick);

あとは、OnClickを定義してあげれば完了です。

おわりに

実際のコードはこちらにあります。

https://github.com/ishikawa-takumi/SamplePrism/tree/master/Sample

-C#, Tech,
-, , , , ,