# 汎用テクニック集 _**最終更新日:2022/03/06**_ ちょっとした小技とか {{toc}} ## バインド関連 ### 異なる型でのプロパティバインド 「Binding」のイベント「Parse」と「Format」を使用すると、型の違うプロパティでもバインドさせることができる。 下記の例は、ColorクラスのForeColorに、stringクラスのm_mainVM.LineColor.Valueをバインドさせているもの。 ``` csharp /* バインド生成 */ Binding bindingLineColor = new(nameof(ForeColor), m_mainVM.LineColor, "Value"); /* コントロールのプロパティが変更された時 */ bindingLineColor.Parse += (object sender, ConvertEventArgs e) => { /* Colorクラスから文字列に変換 */ Color color = (Color)e.Value; e.Value = $"{color.R:X02}{color.G:X02}{color.B:X02}{color.A:X02}"; }; /* コントロールのプロパティに設定する時 */ bindingLineColor.Format += (object sender, ConvertEventArgs e) => { /* 文字列からColorクラスに変換 */ e.Value = ColorTranslator.FromHtml($"#{((string)e.Value).Substring(0, 6)}"); }; /* コントロールにバインド */ PanelParam.LineColor.DataBindings.Add(bindingLineColor); ``` 「Parse」イベントの引数には、コントロールのプロパティに設定された値が格納されている。 この値をバインド先のプロパティの型に合わせて変換などする。 「Format」イベントの引数には、バインド先のプロパティで設定された値が格納されている。 この値をコントロールのプロパティの型に合わせて変換などする。 ・参考 Binding.Format イベント (System.Windows.Forms) | Microsoft Docs https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.binding.format?view=windowsdesktop-6.0 ### コントロール便利バインド関数 コントロールにバインドする際、大体はどのプロパティにバインドするか決まってるので、コントロールごとにどのプロパティをバインドするかの関数を1個噛ませれば楽になると思う。 ``` csharp /// /// 指定したコントロールのプロパティに、データソースのプロパティをバインドします。 /// この関数ではコントロールの種類によって、コントロールのプロパティ名を自動で取得します。 /// /// コントロール /// データソース /// データソースのプロパティ名 /// 表示データの書式を指定 private void SetBindingProperty(Control control, object dataSource, string dataMember, bool formattingEnabled = false) { /* コントロールのプロパティ名を取得 */ string propertyName; if (control is NumericUpDown) { propertyName = nameof(NumericUpDown.Value); } else { propertyName = nameof(Control.Text); } /* バインド */ SetBindingProperty(control, propertyName, dataSource, dataMember, formattingEnabled); } /// /// 指定したコントロールのプロパティに、データソースのプロパティをバインドします。 /// /// コントロール /// コントロールのプロパティ名 /// データソース /// データソースのプロパティ名 /// 表示データの書式を指定 private void SetBindingProperty(Control control, string propertyName, object dataSource, string dataMember, bool formattingEnabled = false) { if (dataSource?.GetType().GetProperty(dataMember) != null) { control.DataBindings.Add(propertyName, dataSource, dataMember, formattingEnabled); } } ``` --- [[csharp:wiki|メインページに戻る]]