4

C#/.NET で PropertyGrid を利用するアプリがあります。

以下に示すクラス/オブジェクトPropertGridを保持します。MyAppObject

class MyAppObject
{
    private List<MyObject> oItems;

    public List<MyObject> Items
    {
        get { return this.oItems; }

    }

}

これまでのところ、うまく機能し、素晴らしく、シンプルです。プロパティ グリッドでユーザーがアイテムを表示できるようにしたいのですが、これはうまくいきますが、PropertyGrid でプロパティを選択すると、ダイアログでさらに .xml を追加することもできますList<MyObject> items

私はこれを望んでいません。アイテムを編集するのではなく、アイテムを表示できるようにしたいだけです。

セッターを提供しないことで考えました(set { this.oItems = value; }):

このような

次に、追加ボタンを許可しません。

これが理にかなっていることを願っています。スクリーンショットはダイアログを示しており、削除したいボタンを丸で囲みました。

ありがとう

4

2 に答える 2

1

読み取り専用リストとして公開する場合は、必要なことを行う必要があります。

[Browsable(false)]
public List<MyObject> Items
{
    get { return this.oItems; }
}
// this (below) is the one the PropertyGrid will use
[DisplayName("Items")]
public ReadOnlyCollection<MyObject> ReadOnlyItems
{
    get { return this.oItems.AsReadOnly(); }
}

として装飾しない限り、個々のオブジェクト (MyObjectインスタンス) のメンバーは引き続き編集可能であることに注意してください[ReadOnly(true)]

お気づきのように、アイテムを追加/削除/編集するためにセッターは必要ありません。これは、グリッドが引き続き.Add.Removeおよびインデクサー ( list[index]) 操作に完全にアクセスできるためです。

于 2012-10-23T08:17:00.103 に答える
0

これは少しトリッキーです。このソリューションには、完全な .NET Framework を使用したビルドが含まれます (クライアントのみのフレームワークには .NET Framework が含まれていないためSystem.Design)。独自のサブクラスを作成CollectionEditorし、UI が終了した後に一時コレクションをどう処理するかを指定する必要があります。

public class MyObjectEditor : CollectionEditor {

    public MyObjectEditor(Type type) : base(type) { }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {

        return ((MyObject)context.Instance).Items;
    }
}

次に、プロパティを次のように装飾する必要がありますEditorAttribute

[Editor(typeof(MyObjectEditor), typeof(UITypeEditor))]
public List<MyObject> Items{
    // ...
}

参考:プロパティ グリッドでコレクションを編集する正しい方法は何ですか

別:

return new ReadOnlyCollection(oItems);

また

return oItems.AsReadOnly();
于 2012-10-23T08:22:34.243 に答える