C#:PropertyGrid仅通过BrowsebleAttributes显示2个以上类别
本文关键字:2个 显示 BrowsebleAttributes PropertyGrid | 更新日期: 2023-09-27 18:29:15
与属性网格相同的问题只显示某些类别,但显示多个类别,而不是仅显示1个。
我有三个类别:全部,红色,蓝色。
我想在PropertyGrid中显示All和Red类别。
我尝试:
myPropertyGrid.BrowsableAttributes = new AttributeCollection(new CategoryAttribute("All"), new CategoryAttribute("Red"));
但是什么也不显示。如果我只放1个CategoryAttribute,它可以很好地工作,但这不是我想要的。
如果您需要这种级别的操作,大多数人会说您错误地实现了属性网格。属性网格可能会被滥用,并被分配属性以使您的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);
我遇到过类似的问题:
问题是,如果为BrowsableAttributes
提供多个值,则PropertyGrid
将只显示具有所有这些属性的属性。因此,如果您提供两个不同的类别,它将只显示两个类别中的属性。CategoryAttribute不允许您指定多个类别,因此这将不起作用。
我通过创建自己的自定义属性类来解决这个问题。
请参阅:使用自定义属性禁用PropertyGrid中的项目