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

C# C:PropertyGrid仅通过BrowsableAttributes显示2+个类别,c#,user-interface,attributes,C#,User Interface,Attributes,与相同的问题,但显示多个类别,而不是仅1个 我有三类:全部,红色,蓝色 我想在PropertyGrid中显示所有和红色类别 我尝试: myPropertyGrid.BrowsableAttributes=新属性集合新类别Tributed,新类别Tributed 但是什么也没有显示。如果我只放置1个CategoryAttribute,它可以正常工作,但这不是我想要的。如果需要这种级别的操作,大多数人会说您没有正确地实现属性网格。属性网格可能会被滥用,属性分配会使GUI易于开发,但对于使用您的代码或

与相同的问题,但显示多个类别,而不是仅1个

我有三类:全部,红色,蓝色

我想在PropertyGrid中显示所有和红色类别

我尝试:

myPropertyGrid.BrowsableAttributes=新属性集合新类别Tributed,新类别Tributed


但是什么也没有显示。如果我只放置1个CategoryAttribute,它可以正常工作,但这不是我想要的。

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

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

显然,这个例子可以用[Browsablefalse]来完成,但我只是简单地演示这个概念

我有

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);

我遇到了类似的问题:

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

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

见: