C#:PropertyGrid仅通过BrowsableAttributes显示2+类别

时间:2014-11-06 02:08:23

标签: c# user-interface attributes

Property grid only show some category相同的问题,但显示的是多个类别,而不是仅显示1个。

我有3个类别:全部,红色,蓝色。

我想在PropertyGrid中显示All和Red类别。

我试试:

myPropertyGrid.BrowsableAttributes = new AttributeCollection(new CategoryAttribute("All"), new CategoryAttribute("Red"));

但没有显示任何内容。如果我只放1个CategoryAttribute它可以正常工作,但这不是我想要的。

2 个答案:

答案 0 :(得分:0)

如果您需要此级别的操作,大多数人会说您错误地实现了属性网格。可以滥用属性网格并分配属性以使您的GUI易于开发,但对于使用您的代码或最终产品的其他人来说,定义的面向目标的GUI可能是更好的选择。我知道这不是你想要的答案,但却是事实。

如果必须使用属性网格,我经常编写一个包装器,它只显示我想要在属性网格上显示的属性。这有助于防止我的代码更改破坏我的最终用户GUI。

显然,这个例子可以用[Browsable(false)]来完成,但是我很容易证明这个概念。

我有

class Vector4
{
    property float X {get;set;}
    property float Y {get;set;}
    property float Z {get;set;}
    property float W {get;set;}
}

但不希望属性W在属性网格中可见。制作一个像

这样的包装器
class Vector4Wrapper
{
    Vector4 refVector;

    property float X 
    {
        get{ return refVector.X; }
        set{ refVector.X = value; }
    }
    property float Y 
    {
        get{ return refVector.Y; }
        set{ refVector.Y = value; }
    }
    property float Z 
    {
        get{ return refVector.Z; }
        set{ refVector.Z = value; }
    }

    Vector4Wrapper(Vector4 refVector)
    {
        refVector = refVector;
    }
}

最后,通过说出类似的内容来使用包装器,只显示所需的属性:

Vector4 vect;
propertyGrid.SelectedObject = new Vector4Wrapper(vect);

答案 1 :(得分:0)

我遇到过类似的问题:

问题在于,如果向BrowsableAttributes提供多个值,则PropertyGrid将仅显示具有所有这些属性的属性。因此,如果您提供两个不同的类别,它将仅显示两个类别中的属性。 CategoryAttribute不允许您指定多个类别,因此这不起作用。

我设法通过创建自己的自定义属性类来解决这个问题。

请参阅: Disabling items in PropertyGrid using Custom Attributes