我有一个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;
}
}
我也有TextBox
。 TextBox
的{{1}}属性绑定到Text
对象:
User
我希望通过textBox.DataBindings.Add("Text", new User("Michael"), "Forename");
获取Forename
的{{1}}属性。怎么做?
注意:上面的代码简化了我的实际代码。
答案 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);