プロジェクト

全般

プロフィール

汎用テクニック集

最終更新日: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);
    }
}

メインページに戻る

他の形式にエクスポート: PDF HTML TXT