如何获取绑定对象属性的属性?

时间:2017-11-21 16:31:03

标签: c# winforms data-binding

我有一个User课程:

public partial class User : INotifyPropertyChanged
{
    private string forename;

    [MaxLength(10)]
    public string Forename
    {
        get => forename;
        set
        {
            forename = value;
            OnPropertyChanged("forename");
        }
    }

    public User(string forename)
    {
        Forename = forename;
    }
}

我也有TextBoxTextBox的{​​{1}}属性绑定到Text对象:

User

我希望通过textBox.DataBindings.Add("Text", new User("Michael"), "Forename"); 获取Forename的{​​{1}}属性。怎么做?

注意:上面的代码简化了我的实际代码。

2 个答案:

答案 0 :(得分:1)

您可以使用反射或类型描述符来获取有关类型的信息。您需要在何时何地执行此操作,具体取决于实施。

由于数据绑定的数据源可以是类或绑定源之类的任何对象,因此依赖类型描述符更灵活,可扩展。例如,如果你想通过将TextBox传递给这样的方法来调用一个方法来应用maxlength:

ApplyMaxLengthToTextBox(textBox1);

然后你可以这样创建方法:

//using System.Linq;
public void ApplyMaxLengthToTextBox(TextBox txt)
{
    var binding = txt.DataBindings["Text"];
    if (binding == null)
        return;
    var bindingManager = binding.BindingManagerBase;
    var datasourceProperty = binding.BindingMemberInfo.BindingField;
    var propertyDescriptor = bindingManager.GetItemProperties()[datasourceProperty];
    var maxLengthAttribute = propertyDescriptor.Attributes.Cast<Attribute>()
        .OfType<MaxLengthAttribute>().FirstOrDefault();
    if (maxLengthAttribute != null)
        txt.MaxLength = maxLengthAttribute.Length;
}

在绑定到对象时进行测试:

textBox1.DataBindings.Add("Text", new MySampleModel(), "SomeProperty");
ApplyMaxLengthToTextBox(textBox1);

在绑定到BindingSource时测试它:

var bs = new BindingSource();
bs.DataSource = new MySampleModel();
textBox1.DataBindings.Add("Text", bs, "SomeProperty");
ApplyMaxLengthToTextBox(textBox1);

答案 1 :(得分:-1)

你可以尝试下面的代码段

var prop = typeof(User).GetProperty("Forename");
var att = prop.GetCustomAttributes(typeof(MaxLength), false);