プロパティ バインディング (Property Binding)

プロパティ バインディングでは、Controlを継承するクラスのプロパティの値を、アプリケーション設定に縛る (Binding) ことができます。

プロパティとアプリケーション設定との拘束

プロパティ バインディングの設定は、コントロールのプロパティ ウィンドウから行えます。

設定するプロパティを選択し、(新規) をクリックします。

設定に任意の名前を付けます。必要ならば、ここで既定値とスコープを設定します。

作成したアプリケーション設定が、一覧に追加されます。

このとき次のファイルに、それぞれ以下のようなコードが追加されます。

ControlName.Designer.cs ファイル

デザイナが生成するファイルで、初期値にアプリケーション設定の値が設定されます。

private void InitializeComponent()
{
...
    this.Location = global::Namespace.Properties.Settings.Default.location;
...
}

Settings.Designer.cs ファイル

Settingsクラスに、追加した設定値用のプロパティが定義されます。

internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
...
    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("0, 0")]
    public global::System.Drawing.Point location {
        get {
            return ((global::System.Drawing.Point)(this["location"]));
        }
        set {
            this["location"] = value;
        }
    }
...
}

Settings.Settings ファイル

設定の名前や型の情報が追記されます。

<SettingsFile xmlns="
...
  <Setting Name="location" Type="System.Drawing.Point" Scope="User">
    <Value Profile="(Default)">0, 0</Value>
  </Setting>
...
</SettingsFile>

Settings.Settingsの内容は、設定デザイナでは次のように表示されます。

設定値は既定では追加した順で表示されるため、これを変更するにはSettings.Settingsをエディタで開き、Setting要素の記述順を変更します。

値の保存

必要なコードのあらかたは自動でコードが生成されますが、保存の処理だけは明示的に記述する必要があります。しかしそれはProperties.Settings.Default.Save()を呼び出すだけであり、たとえばフォームのプロパティを保存するならば、それが閉じられようとしているときに次のように呼びます。

protected override void OnFormClosing( FormClosingEventArgs e )
{
    base.OnFormClosing( e );

    Properties.Settings.Default.Save();
}

フォームのサイズの保存

フォームのサイズをプロパティ バインディングを使用して設定すると、最大化・最小化時に適切に処理されません。よってサイズに関しては明示的にコードを記述する必要があります。設定 (My.Settings) の動作 - MSDN フォーラム

protected override void OnFormClosing( FormClosingEventArgs e )
{
    base.OnFormClosing( e );

    if( this.WindowState != FormWindowState.Normal )
    {
        // 通常のウィンドウ状態でフォームの位置とサイズを保存する
        Properties.Settings.Default.formSize = this.RestoreBounds.Size;
        Properties.Settings.Default.formLocation = this.RestoreBounds.Location;

        // @note
        // 最大化・最小化された状態の位置は無効な値となっているため
        // 通常のウィンドウ状態の位置で上書きする。
    }
    else
    {
        // 現在のフォームのサイズを保存する
        Properties.Settings.Default.formSize = this.Size;

        // @note
        // サイズのプロパティはプロパティ バインディングを使用していないため
        // 明示的にアプリケーション設定に保存する。
    }

    Properties.Settings.Default.Save();
}

このように保存したフォームのサイズは、コンストラクタなどで

this.Size = Properties.Settings.Default.formSize;

として読み込むことで、終了時の状態を復元できます。

Controlを継承しないクラスの値の保存

Controlを継承しないクラスのプロパティにはバインディングできないため、アプリケーション設定を保存するのと同様に処理します。

Properties.Settings.Default.width1 = this.columnHeader1.Width;
Properties.Settings.Default.width2 = this.columnHeader2.Width;

Properties.Settings.Default.Save();

値の読込

ビュー デザイナから設定すると、コントロールのInitializeComponent()メソッドで次のように拘束と初期化が行われます。

this.DataBindings.Add(
    new System.Windows.Forms.Binding(
        "Location",
        global::Namescope.Properties.Settings.Default,
        "location",
        true,
        System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

this.Location = global::Namescope.Properties.Settings.Default.location;

このDataBindings.Add()は次のように宣言されており、

public void Add(
    Binding binding
)
ControlBindingsCollection.Add メソッド (Binding) (System.Windows.Forms) | MSDN

その引数とするBindingのコンストラクタの宣言は、次のようになっています。

public Binding(
    string propertyName,                      // バインドするコントロールのプロパティ名
    object dataSource,                        // データソースのオブジェクト
    string dataMember,                        // バインドするプロパティまたはリスト
    bool formattingEnabled,                   // trueならば、表示されるデータの書式を指定する
    DataSourceUpdateMode dataSourceUpdateMode // データソースを更新するタイミング
)
Binding コンストラクター (String, Object, String, Boolean, DataSourceUpdateMode) (System.Windows.Forms) | MSDN
Microsoft Learnから検索