C#プログラミング

【C#】MVVMでチェックボックスを使う方法【WPF】

チェックボックス記事のアイキャッチ画像 C#

C#(WPF)でチェックボックスを使う方法を紹介します。チェックボックスをクリックして操作する方法と、bool変数が切り替わるとチェックボックスのGUI(見た目)も連動して変化するサンプルを作成しました。これを理解すればチェックボックスは十分かと思います。

スポンサーリンク

C#のチェックボックスの使い方

チェックボックスは、bool型変数と紐づけられて使用されます。

主な用途としては、以下のような状態管理や条件分岐になります。

  • 状態に応じて、一部処理を実行可能/実行不可能にする
  • フラグに応じて、データの計算方法を切り替えたいとき
スポンサーリンク

サンプルコード

作成したサンプルは以下の通り。

サンプルアプリの挙動の様子

チェックボックスをクリック、またはボタンを押すとフラグ(boolo変数)が切り替わります。
フラグの内容に応じて対応したGUIが常に表示されるようになっています。

またコードはMVVM形式で作成しています。

View

XAMLは以下の通り。

<Window x:Class="CheckBox.Views.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"
        mc:Ignorable="d"
        Title="CheckBox" Height="200" Width="300">
    <Grid>
        <StackPanel Orientation="Vertical">
            <CheckBox Content="状態チェックボックス" IsChecked="{Binding state_flg}" Margin="10"/>
            
            <!--フラグ切り替えボタン-->
            <Button Content="フラグ切り替えボタン" Command="{Binding Button1_Pushed}" />
            <!--状態表示テキスト-->
            <TextBlock Text="{Binding state_txt}" />
        </StackPanel>
    </Grid>
</Window>

コードビハインドは以下の通り(いつもの)。

using CheckBox.ViewModels;
using System.Windows;

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

            this.DataContext = vm;
        }
    }
}

ViewModel

2つの変数(state_flg、state_txt)をXAMLとのバインド用に使用しています。

SwitchTextメソッドは、フラグ(state_flg)が変わった際に必ず呼ばれ、フラグに応じたテキストをstate_txtに代入するものです。

using CheckBox.Common;
using System;
using System.ComponentModel;
using System.Windows.Input;

namespace CheckBox.ViewModels
{
    internal class MainViewModel : INotifyPropertyChanged
    {
        //コマンド
        public ICommand Button1_Pushed { get; set; }

        public MainViewModel()
        {
            //コマンド
            Button1_Pushed = new RelayCommand(Button1_Command);
        }

        //コマンドの処理内容
        private void Button1_Command()
        {
            //フラグの切り替え
            if (state_flg == true)
            {
                state_flg = false;
            }
            else
            {
                state_flg = true;
            }

            //フラグに応じてテキスト切り替え
            SwitchText();
        }

        //状態表示テキスト切り替え関数
        private void SwitchText()
        {
            //フラグに応じて切り替え
            if (state_flg == true)
            {
                state_txt = "True";
            }
            else
            {
                state_txt = "False";
            }
        }

        //ステータス表示用テキスト
        private string _state_txt = "False";
        public string state_txt
        {
            get { return _state_txt; }
            set
            {
                _state_txt = value;
                NotifyPropertyChanged("state_txt");
            }
        }

        //ステータスフラグ
        private bool _state_flg;
        public bool state_flg
        {
            get { return _state_flg; }
            set
            {
                _state_flg = value;
                NotifyPropertyChanged("state_flg");

                //表示テキストの切り替え
                SwitchText();
            }
        }

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

73行目がないとチェックボックス自体をクリックした際に、テキストが変化しません。
(StyleのDataTriggerを使用して、フラグとテキストを連携する方法もあります。)

以下GUI関連記事。

コメント

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