4

我有一个在 C#/.NET 中使用 PropertyGrid 的应用程序

PropertGrid持有MyAppObject如下所示的类/对象..

class MyAppObject
{
    private List<MyObject> oItems;

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

    }

}

到目前为止,它运行良好、美观且简单。我希望属性网格允许用户查看项目,这很好,但是当您在 PropertyGrid 中选择属性时,对话框还允许添加更多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)].

正如您所注意到的,setter 不需要添加/删除/编辑项目。那是因为网格仍然可以完全访问.Add,.Remove和 indexer ( 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 回答