WPF_MVVM_CheckBox

CheckBoxをMVVMで利用する。

ViewModel

Prismを利用してデータバインディングします。


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

namespace WpfPrismMvvm
{
    public class MainWindowViewModel : BindableBase
    {
        /// <summary>
        /// チェックボックス状態変化を捕捉した際に実行するコマンド
        /// </summary>
        public DelegateCommand<EventArgs> CheckBoxAction { get; private set; }

        /// <summary>
        /// チェックボックスの状態表示用テキスト
        /// </summary>
        private string _checkBoxStatus;
        public string CheckBoxStatus
        {
            get { return _checkBoxStatus; }
            set { SetProperty(ref _checkBoxStatus, value); }
        }

        private bool _checkBox1;
        public bool CheckBox1
        {
            get { return _checkBox1; }
            set { SetProperty(ref _checkBox1, value); }
        }

        private bool _checkBox2;
        public bool CheckBox2
        {
            get { return _checkBox2; }
            set { SetProperty(ref _checkBox2, value); }
        }

        private bool _checkBox3;
        public bool CheckBox3
        {
            get { return _checkBox3; }
            set { SetProperty(ref _checkBox3, value); }
        }

        public MainWindowViewModel()
        {
            CheckBoxAction = new DelegateCommand<EventArgs>(x => checkBoxAction(x));
            CheckBox1 = false;
            CheckBox2 = false;
            CheckBox3 = false;
        }

        /// <summary>
        /// チェックされたチェックボックスの名前をCheckBoxStatusに記入する
        /// </summary>
        /// <param name="e"></param>
        private void checkBoxAction(EventArgs e)
        {
            string msg = string.Empty;
            if (CheckBox1)
            {
                msg += "CheckBox1 ";
            }
            if (CheckBox2)
            {
                msg += "CheckBox2 ";
            }
            if (CheckBox3)
            {
                msg += "CheckBox3 ";
            }
            CheckBoxStatus = msg;
        }
    }
}

xaml

チェックボックスの状態変化として、Checked/Uncheckedイベントの捕捉、Clickイベントの捕捉、コマンドの直接割り当てが可能です。


<Window x:Class="WpfPrismMvvm.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="450">

    <StackPanel>
        <StackPanel Orientation="Horizontal" Margin="10">
            <!--チェックイベントを捕捉してコマンドを実行する-->
            <CheckBox Content="CheckBox1" IsChecked="{Binding CheckBox1}" Margin="10">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Checked">
                        <i:InvokeCommandAction Command="{Binding CheckBoxAction}" />
                    </i:EventTrigger>
                    <i:EventTrigger EventName="Unchecked">
                        <i:InvokeCommandAction Command="{Binding CheckBoxAction}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </CheckBox>

            <!--チェックボックスにコマンドを割り当てて実行する-->
            <CheckBox Content="CheckBox2" IsChecked="{Binding CheckBox2}" Margin="10" Command="{Binding CheckBoxAction}" >
            </CheckBox>

            <!--Clickイベントを捕捉してコマンドを実行する-->
            <CheckBox Content="CheckBox3" IsChecked="{Binding CheckBox3}" Margin="10" >
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <i:InvokeCommandAction Command="{Binding CheckBoxAction}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </CheckBox>
        </StackPanel>

        <StackPanel Orientation="Horizontal" Margin="10">
            <TextBlock Text="checked:" FontSize="16" Margin="10"/>
            <TextBlock Text="{Binding CheckBoxStatus}" FontSize="16" Margin="10"/>
        </StackPanel>
    </StackPanel>
</Window>

xaml.cs


using System.Windows;

namespace WpfPrismMvvm
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            MainWindowViewModel vm = new MainWindowViewModel();
            this.DataContext = vm;
        }
    }
}


関連ページ