に 1 つのクラスの複数のインスタンスを表示したいPropertyGrid
。クラスは次のようになります。
public class Parameter
{
[Description("the name")]
public string Name { get; set; }
[Description("the value"), ReadOnly(true)]
public string Value { get; set; }
[Description("the description")]
public string Description { get; set; }
}
にそのクラスの多くのインスタンスがありますTreeView
。でそれらのいずれかを選択するとTreeView
、プロパティがPropertyGrid
期待どおりに表示されます。ここまでは順調ですが、この動作を次のようにカスタマイズしたいと思います。
単一のインスタンスごとに、ユーザーが特定のプロパティを変更できないようにしたいと考えています。クラス内で設定することによりReadOnly(true)
(上記の例でわかるように)、すべてのValue
プロパティがクラスレベルで無効になります。
いくつかの調査の後、実行時に特定のプロパティを有効/無効にする機会を与える次の解決策を見つけました。
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this)["Value"];
ReadOnlyAttribute attr =
(ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo isReadOnly = attr.GetType().GetField(
"isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
isReadOnly.SetValue(attr, false);
このアプローチは問題なく機能しますが、残念ながらクラスレベルでのみ機能します。これは、 を に設定すると、すべてValue
の-objects のプロパティが書き込み可能になることを意味します。しかし、私はこれをその1つの特定のオブジェクト(したがってobject-level)でのみ必要とします。読み取り/書き込みプロパティと読み取り専用プロパティ用に個別のクラスを作成したくありません。isReadOnly
false
Parameter
Value
私はアイデアが不足しているので、あなたの助けは大歓迎です:)
前もって感謝します!
編集:読み取り専用プロパティをグレー表示にする必要があるため、ユーザーは編集が許可されていない、または編集できないことがわかります。