2017-11-21 12 views
1

私は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経由のMaxLength属性:TextBox「私はForenameを取得したいと思い

textBox.DataBindings.Add("Text", new User("Michael"), "Forename"); 

TextプロパティがUserオブジェクトにバインドされています」。どうやってするか?


注:上記のコードは私の実際のコードを簡略化したものです。

+0

宣言的に行うことはできませんが、あなたはそれを反映させることができます(https://docs.microsoft.com/en-us/dotnet/standard/attributes/retrieving-information-stored-in-属性) – stuartd

+0

コードにデータバインディングを設定しているので、メソッドdoをデータバインドに作成し、メソッドのmaxlengthをコントロールに適用します。 maxlengthを取得するには、リフレクションに加えて、タイプ記述子を使用することもできます。 –

+0

@RezaAghaei - あなたは答えを精緻化できますか? – Sipo

答えて

1

スニペット以下試すことができます。どこで、いつ行う必要があるかは、実装に依存します。

データバインディングのデータソースは、クラスまたはバインディングソースのようなオブジェクトである可能性があるため、型記述子に依存するためにより柔軟で拡張性があります。あなたはこのような方法にTextBoxを渡すことによってMAXLENGTHを適用する方法をコールする場合たとえば、次の場合にそれをテストするには

//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; 
} 

ApplyMaxLengthToTextBox(textBox1); 

次に、あなたがこの方法メソッドを作成することができますオブジェクトへのバインディング:BindingSourceに結合したときに、それをテストする

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

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

この回答は素晴らしいですし、将来の読者に役立つと確信しています。しかし、私はそれの背後にあるたくさんのアイデアに恵まれていません。 'Expression'、' Func'、 'MemberExpression'などです。拡張メソッドなどを呼び出さない単純なコードスニペットを追加してください。 @ touchofevilのようなものが書きましたが、ハードコードされていませんか?どうもありがとう! – Sipo

+0

これは、Windowsフォームのデータバインディングルールを尊重する最も簡単な解決策です。反射はデータバインディングの際には良い考えではありません。データバインディングは、型記述子とプロパティ記述子で動作します。 –

+0

リフレクションとデータバインディングを組み合わせる際の問題点は何ですか? – Sipo

-1

あなたはあなたがタイプに関する情報を取得するために反射やタイプ記述子を使用することができます

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

ありがとう!あなたは 'User'型、プロパティ名' Forename'、 'MaxLength'属性をハードコーディングしています。私は 'User'オブジェクトにバインドされているので、私は' textBox'オブジェクトを使ってこの情報をすべて取得したいと思います。再度、感謝します! – Sipo

関連する問題