汎用テクニック集¶
最終更新日:2022/03/06
ちょっとした小技とか
バインド関連¶
異なる型でのプロパティバインド¶
「Binding」のイベント「Parse」と「Format」を使用すると、型の違うプロパティでもバインドさせることができる。
下記の例は、ColorクラスのForeColorに、stringクラスのm_mainVM.LineColor.Valueをバインドさせているもの。
/* バインド生成 */
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個噛ませれば楽になると思う。
/// <summary>
/// 指定したコントロールのプロパティに、データソースのプロパティをバインドします。
/// この関数ではコントロールの種類によって、コントロールのプロパティ名を自動で取得します。
/// </summary>
/// <param name="control">コントロール</param>
/// <param name="dataSource">データソース</param>
/// <param name="dataMember">データソースのプロパティ名</param>
/// <param name="formattingEnabled">表示データの書式を指定</param>
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);
}
/// <summary>
/// 指定したコントロールのプロパティに、データソースのプロパティをバインドします。
/// </summary>
/// <param name="control">コントロール</param>
/// <param name="propertyName">コントロールのプロパティ名</param>
/// <param name="dataSource">データソース</param>
/// <param name="dataMember">データソースのプロパティ名</param>
/// <param name="formattingEnabled">表示データの書式を指定</param>
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);
}
}