Строго типизированная привязка данных Windows Forms

Я изучаю строго типизированную привязку данных Windows Forms с использованием методов расширения. Я получил эту далеко следующую помощь от Ксавье , как показано ниже:

using System;
using System.Linq.Expressions;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public static Binding Add
        (this ControlBindingsCollection dataBindings,
            object dataSource,
            Expression> controlExpression,
            Expression> objectExpression)
    {
        return Add(dataBindings, dataSource, controlExpression, objectExpression, false);
    }

    public static Binding Add
        (this ControlBindingsCollection dataBindings,
            object dataSource,
            Expression> controlExpression,
            Expression> objectExpression,
            bool formattingEnabled)
    {
        string controlPropertyName = ProcessExpression(controlExpression.Body);
        string bindingTargetName = ProcessExpression(objectExpression.Body);

        return dataBindings
            .Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled);
    }

    public static Binding Add
        (this ControlBindingsCollection dataBindings,
            object dataSource,
            Expression> controlExpression,
            Expression> objectExpression)
    {
        return Add(dataBindings, dataSource, controlExpression, objectExpression, false);
    }

    public static Binding Add
        (this ControlBindingsCollection dataBindings,
            object dataSource,
            Expression> controlExpression,
            Expression> objectExpression,
            bool formattingEnabled
        )
    {
        string controlPropertyName = ProcessExpression(controlExpression.Body);
        string bindingTargetName = ProcessExpression(objectExpression.Body);

        return dataBindings.Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled);
    }

    private static string ProcessExpression(Expression expression)
    {
        string propertyName;
        if (expression is MemberExpression)
        {
            propertyName = ((MemberExpression) (expression)).Member.Name;
        }
        else if (expression is UnaryExpression)
        {
            propertyName = ((MemberExpression) ((UnaryExpression) (expression)).Operand).Member.Name;
        }
        else
        {
            throw new InvalidOperationException(
                "Unknown expression type error in DataBindingsExtensionMethods.Add");
        }
        return propertyName;
    }
}

Теперь я могу настроить привязку данных следующим образом:

txtBoundInt.DataBindings.Add
    (bindingSource, tb => tb.Text, contact => contact.Id);

Или вот это:

cboBoundSelectedItem.DataBindings.Add
            
            (bindingSource, cbo => cbo.SelectedItem, con => con.ContactType)

Кажется, что происходит много приведений выражений. продолжается, хотя. Есть ли лучший способ?


Редактировать: Я нашел лучший способ, но у меня возникли проблемы с заменой этого вопроса на этот ответ - он воспроизведен ниже @Carl_G.

8
задан 14 revs 23 May 2017 в 12:16
поделиться

1 ответ

Как насчет установки типа возвращаемого значения для объекта?

public static Binding Add<T>
    (this ControlBindingsCollection dataBindings, object dataSource,
    Expression<Func<Control, object>> controlLambda,
    Expression<Func<T, object>> objectLambda) {
    string controlPropertyName =
          ((MemberExpression)(controlLambda.Body)).Member.Name;
    string bindingTargetName =
          ((MemberExpression)(objectLambda.Body)).Member.Name;

    return dataBindings.Add
         (controlPropertyName, dataSource, bindingTargetName);
}
6
ответ дан 5 December 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: