1

ため息、別のPropertyGridの質問。実際に避けられない問題にぶつかるまでは、これを回避できると思いました。

TreeViewから選択したオブジェクトに応じて、読み取り専用にする必要がある場合と変更可能にする必要がある場合があるブールプロパティがあります。

私の質問は、プロパティのReadOnlyAttributeを動的に変更するにはどうすればよいですか?明らかに、ブール変数を作成してから、ReadOnlyAttribute(boolVar)のように設定しようとしても機能せず、今ではアイデアがありません。

私が考えることができる唯一の解決策は、このプロパティが書き込み可能で、読み取り専用のアイテムに対して、ほぼ同一のクラスを別々に作成することですが、これは私には少し不誠実に思えます。

ヘルプ?:)

4

3 に答える 3

3

ICustomTypeDescriptorを実装することにより、クラスのプロパティに関する動的な情報をプロパティグリッドに提供できます。

プロパティグリッドはICustomTypeDescriptor.GetProperties()を呼び出し、 PropertyDescriptorsから派生したオブジェクトのコレクションを返します。実装では、 PropertyDescriptor.IsReadOnlyプロパティをオーバーライドして、ロジックを実装できます。

これはそもそもかなりの作業ですが、プロパティの名前と説明を動的に返し(ローカリゼーションに役立ちます)、プロパティを読み取り専用として動的にマークし、プロパティを動的に表示および非表示にし、多くのことを実行する可能性があります。他の有用なものの。

于 2009-09-17T19:47:57.023 に答える
2

私が行うことは、保護されたバージョンのプロパティを使用して基本クラスを作成し、次に読み取り専用ビットと非読み取り専用ビットを持つ基本クラスを継承する2つのクラスを作成することです。

于 2009-09-17T19:44:34.010 に答える
0

複数のクラスに関連する型変換を回避するために、これらの線に沿って何かを試すことができます。

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;
            }
        }
    }
}
于 2009-09-17T20:00:46.107 に答える