2012-04-29 10 views
1

私は自分のアプリケーションでPropertyGridを使用しています。実行時にカスタムデータの条件で可視性と読み取り専用プロパティを変更する必要がありました。プロパティのgetが呼び出されたときに発生するイベントを検索する

私はそれの準備ができて&簡単な何かを見つけることができませんでしたが、私は次のように実行時にReadOnlyAttributeBrowsableAttributeプロパティを変更することで回避策が見つかりました:今

protected void SetBrowsable(string propertyName, bool value) 
{ 
    PropertyDescriptor property = TypeDescriptor.GetProperties(GetType())[propertyName]; 
    BrowsableAttribute att = (BrowsableAttribute)property.Attributes[typeof(BrowsableAttribute)]; 
    FieldInfo cat = att.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance); 

    if (property.Attributes.Cast<Attribute>().Any(p => p.GetType() == typeof(BrowsableAttribute))) 
     cat.SetValue(att, value); 
} 

protected void SetReadOnly(string propertyName, bool value) 
{ 
    PropertyDescriptor property = TypeDescriptor.GetProperties(GetType())[propertyName]; 
    ReadOnlyAttribute att = (ReadOnlyAttribute)property.Attributes[typeof(ReadOnlyAttribute)]; 
    FieldInfo cat = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 

    if (property.Attributes.Cast<Attribute>().Any(p => p.GetType() == typeof(ReadOnlyAttribute))) 
     cat.SetValue(att, value); 
} 

、私の問題は、どこがすべきですこれらのメソッドを呼び出しますか?これらのメソッドを呼び出すためにobjectが処理できるイベントはありますか?たぶんインタフェースを実装することによって。

答えて

1

property-getが呼び出されたときに発生するinbuiltイベントはありません。もちろん

あなたは(一般的にデコレータとしての反射記述子にチェーンのPropertyDescriptor、)カスタム記述子を記述する場合は、ディスクリプタ経由でのみ(データバインディングなど)をアクセスをインターセプトし、あなたがやりたいことができます - しかし、任意の型(あなたが書いていない型も含む)のために。

実行時のリフレクションによる属性値の設定は大したことではありません。これは、主にTypeDescriptorキャッシュの偶然によって行われています。これを行う場合は、TypeDescriptor.AddAttributes(または類似のもの)を使用することをお勧めします。しかし、あなたがやろうとしていることは、カスタムモデルを実装することではるかに適切に行われます。あなたがこれを表示している場所に応じて、これは、1つまたはによって行うことができます。

  • がGetPropertiesのをオーバーライドし、カスタムのTypeConverterを追加し、データに基づいて、実行時にカスタム記述子を提供 - PropertyGridの
  • 実装ICustomTypeDescriptorのために主に動作しますあなたのオブジェクトにGetPropertiesを実装し、データに基づいて実行時にカスタム記述子を提供します - ほとんどのコントロールのために動作します -
  • カスタムTypeDescriptionProviderを追加し、タイプ(TypeDescriptor.AddProvider)に関連付ける。これは、オブジェクトを記述子ブードゥーから分離します。

これらのうちのどれかがトリッキーです!最も簡単なのはTypeConverterオプションで、これはあなたがPropertGridに言及しているのでうまくいきます。 ExpandableObjectConverterから継承し、GetPropertiesをオーバーライドし、必要に応じてフィルタリングし、必要に応じて読み取り専用のカスタム記述子を指定します。カスタムコンバータタイプを指定して、タイプにTypeConverterAttributeを追加します。

強調:このブランチの.NETはかなり複雑で、あいまいであり、使い方が減っています。しかし、それは動作します。

関連する問題