プロパティ バインディングでは、Controlを継承するクラスのプロパティの値を、アプリケーション設定に縛る (Binding) ことができます。
プロパティ バインディングの設定は、コントロールのプロパティ ウィンドウから行えます。
設定するプロパティを選択し、(新規) をクリックします。
設定に任意の名前を付けます。必要ならば、ここで既定値とスコープを設定します。
作成したアプリケーション設定が、一覧に追加されます。
このとき次のファイルに、それぞれ以下のようなコードが追加されます。
デザイナが生成するファイルで、初期値にアプリケーション設定の値が設定されます。
private void InitializeComponent() { ... Location = global::Namespace.Properties.Settings.Default.location; ... }
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; } } ... }
設定の名前や型の情報が追記されます。
<SettingsFile xmlns=" ... <Setting Name="location" Type="System.Drawing.Point" Scope="User"> <Value Profile="(Default)">0, 0</Value> </Setting> ... </SettingsFile>
Settings.Settingsの内容は、設定デザイナでは次のように表示されます。
設定値は既定では追加した順で表示されるため、これを変更するにはSettings.Settingsをエディタで開き、Setting要素の記述順を変更します。
Settings.Settingsをエディタで編集するときは、空白なども編集前後で相違ないようにします。相違があると、
設定 '***' の値が app.config ファイルで変更されました。 .settings ファイルでの現在の値は'***' です app.config ファイルでの新しい値は '***' です .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( WindowState != FormWindowState.Normal ) { // 通常のウィンドウ状態でフォームの位置とサイズを保存する Properties.Settings.Default.formSize = RestoreBounds.Size; Properties.Settings.Default.formLocation = RestoreBounds.Location; // @note // 最大化・最小化された状態の位置は無効な値となっているため // 通常のウィンドウ状態の位置で上書きする。 } else { // 現在のフォームのサイズを保存する Properties.Settings.Default.formSize = Size; // @note // サイズのプロパティはプロパティ バインディングを使用していないため // 明示的にアプリケーション設定に保存する。 } Properties.Settings.Default.Save(); }
このように保存したフォームのサイズは、コンストラクタなどで
Size = Properties.Settings.Default.formSize;
として読み込むことで、終了時の状態を復元できます。
Controlを継承しないクラスのプロパティにはバインディングできないため、アプリケーション設定を保存するのと同様に処理します。
Properties.Settings.Default.width1 = this.columnHeader1.Width; Properties.Settings.Default.width2 = this.columnHeader2.Width; Properties.Settings.Default.Save();
ビュー デザイナから設定すると、コントロールのInitializeComponent()メソッドで次のように拘束と初期化が行われます。
DataBindings.Add( new System.Windows.Forms.Binding( "Location", global::Namescope.Properties.Settings.Default, "location", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 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