PropertyGrid-動的に変更されるReadOnlyAttribute
-
10-07-2019 - |
質問
ため息、別のPropertyGrid質問。実際に回避できない問題が発生するまで、この問題を回避できると考えていました。
ブールプロパティがあり、読み取り専用にする必要があり、TreeViewから選択したオブジェクトに応じて変更できる必要がある場合があります。
私の質問は、プロパティのReadOnlyAttributeを動的に変更する方法です。明らかに、ブール変数を作成してから、ReadOnlyAttribute(boolVar)のように設定しようとしても機能せず、今ではアイデアがありません。
私が考えることができる唯一の解決策は、このプロパティが書き込み可能なアイテムと読み取り専用のアイテムに別々のほぼ同一のクラスを作成することですが、これは私には少し違法なようです。
ヘルプ? :)
解決
プロパティの保護バージョンで基本クラスを作成し、読み取り専用ビットと非読み取り専用ビットを持つ基本クラスを継承する2つのクラスを作成します。
他のヒント
プロパティグリッドは、 ICustomTypeDescriptor.GetProperties()を呼び出します。 PropertyDescriptors から派生したオブジェクトのコレクションを返します。実装では、 PropertyDescriptor.IsReadOnly をオーバーライドできます。 a>プロパティとロジックを実装します。
これはそもそもかなりの作業ですが、プロパティ名と説明を動的に返す(ローカライズに役立つ)、プロパティを読み取り専用として動的にマークする、プロパティを動的に表示および非表示にする、他の多くの便利なことを行います。
これらの行に沿って何かを試して、複数のクラスに関連する型変換を回避することができます。
class TestClass
{
private bool isMyPropertyReadOnly;
public bool IsMyPropertyReadOnly
{
get { return isMyPropertyReadOnly; }
set { isMyPropertyReadOnly = value; }
}
private int myVar;
public int MyProperty
{
get { return myVar; }
set
{
if (isMyPropertyReadOnly)
{
throw new System.Exception("The MyProperty property is read-only.");
}
else
{
myVar = value;
}
}
}
}