概要
bool型の変数が複数ある場合、それぞれの変数の値をひとつの変数で管理する方法について記載しました。
説明
例えばWPFのMVVMパターンの場合、下記のようにとある画面 (以下、サンプル画面と表記します) にトグルボタンが3つあり、
ViewModelに上記3つのボタンの押下状態を表すbool型のプロパティを持っているとします。
bool型のプロパティはそれぞれ、
-
isButtonASelected
(ボタンAの押下状態) -
isButtonBSelected
(ボタンBの押下状態) -
isButtonCSelected
(ボタンCの押下状態)
という名前になっているとします。
上記のような場合で、各ボタンの押下状態をどこかに保存したい場合にそのまま保存しようとすると、A~Cボタンそれぞれの押下状態 (true
もしくは false
) を保存することになり、保存領域も各ボタンの数の分だけ用意しないといけません。
※例えばボタンが5つあったら5つのbool値を保存することになるので、5つの保存領域が必要です。
上記のような場合に、保存領域をひとつのみで完結できる (ボタンの押下状態をひとつの変数で管理する) 方法を記載します。
方法
まず以下のように、FlagsAttribute
を付与したenumを定義します。
[Flags]
enum ButtonStatus
{
None = 0,
ButtonASelected = 1,
ButtonBSelected = 2,
ButtonCSelected = 4
}
enumにFlagsAttribute
を定義すると、emumをビットフラグとして扱えるようになります。
※参考
上記のFlagsAttribute
を定義したenumをもとに、今回はサンプル画面のボタンの押下状態を保存、復元してみます。
サンプル画面のボタンの押下状態を取得する
まずはサンプル画面の各ボタンの押下状態をひとつの変数に代入する方法です。
var buttonStatus = ButtonStatus.None;
if (isButtonASelected) buttonStatus |= ButtonStatus.ButtonASelected;
if (isButtonBSelected) buttonStatus |= ButtonStatus.ButtonBSelected;
if (isButtonCSelected) buttonStatus |= ButtonStatus.ButtonCSelected;
上記の形で、変数buttonStatus
に各ボタンの押下状態をまとめた値が代入されます。
もちろん通常のEmumと同様、int型にも変換ができます。
このbuttonStatus
の値をどこかに保存しておけば、いつでもサンプル画面のボタン押下状態を復元することができます。
保存しておいた値からトグルボタンの押下状態を復元する
サンプル画面のボタンの押下状態を取得するで変数buttonStatus
にボタンの押下状態を代入しましたが、次はこの変数を使用して、押下状態を復元する方法です。
// ボタンAの復元
bool isButtonASelected = (buttonStatus & ButtonStatus.ButtonASelected) != 0;
// ボタンBの復元
bool isButtonBSelected = (buttonStatus & ButtonStatus.ButtonBSelected) != 0;
// ボタンCの復元
bool isButtonCSelected = (buttonStatus & ButtonStatus.ButtonCSelected) != 0;
上記のかたちでbuttonStatus
の値をもとに、各bool型のプロパティにtrue
もしくはfalse
が格納されます。
上記コードの変数buttonStatus
はenum型の想定ですが、通常のenumと同様に整数値からenum型にキャストすることもできます。なので保存していた値が整数値の場合は事前にenum型にキャストしてから、上記のコードのように行うと復元できます。
補足
最初に定義したenumですが、下記のように2進数で表現することもできます。
このようにすると見やすいかもしれません。
※例としてボタンがA~Fの6つある場合で記載しています。
[Flags]
enum ButtonStatus
{
None = 0b_000_000,
ButtonASelected = 0b_000_001,
ButtonBSelected = 0b_000_010,
ButtonCSelected = 0b_000_100,
ButtonDSelected = 0b_001_000,
ButtonESelected = 0b_010_000,
ButtonFSelected = 0b_100_000,
}
二進数は先頭に0b
をつけて表現します。
また_
を付けて定位置で区切ると、視覚的にも見やすくなります。
終わりに
今回はトグルボタン3つの例でしたが、これがチェックボックス等、他のON、OFFを表現するコントロールの場合でも同じように対応できます。(当たり前ですが)
またボタンが4つ以上の場合も今回のパターンをベースに対応が可能です。