我试图在运行时更改我的一个类中的变量的Browsable属性。包含该属性的类如下所示:
public class DisplayWallType : WallType
{
[TypeConverter(typeof(SheathingOptionsConverter))]
[Browsable(false)]
public override Sheathing SheathingType { get; set; }
public DisplayWallType(string passedName, string passedType, bool passedMirrorable, Distance passedHeight, string passedStudPattern, Distance passedStudSpacing, VaporBarrier passedBarrier)
: base(passedName, passedType, passedMirrorable, passedHeight, passedStudPattern, passedStudSpacing, passedBarrier)
{
}
/// <summary>
/// Empty constructor for XML serialization
/// </summary>
public DisplayWallType()
{
}
}
我最初为SheathingType将其设置为false,因为我不希望该属性以我的应用程序的第一种形式显示。但是,我确实希望它在我的第二种形式中可见,所以我有这种方法来改变它
private void _makeSheathingVisible(DisplayWallType wallTypeToMakeSheathingVisible)
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(wallTypeToMakeSheathingVisible.GetType())["SheathingType"];
BrowsableAttribute attrib = (BrowsableAttribute)descriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrow = attrib.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
isBrow.SetValue(attrib, true);
}
上面的方法采用DisplayWallType对象并确保将Browsable设置为true。我的第二种形式是树形视图和属性网格。树视图使用DisplayWallType实例填充,当选择一个时,将其传递给该方法,以便SheathingType在PropertiesGrid中显示父类的其余属性。
但是,SheathingType仍然没有显示为属性,所以我的方法有问题,但我不知道是什么
除了你有Browsable
显式声明之外,你不能获得一个确切属性的TypeDescriptor
属性。在你的情况下,GetField("browsable")
将为所有属性返回FieldInfo
,并将它们切换为可见的true。如果您有一些属性并将一个属性设置为false,则会出现相同的情况 - 它将隐藏所有属性。
为所需属性提供自定义TypeDescriptor或使用https://www.codeproject.com/articles/7852/propertygrid-utilities等解决方案。
我知道这个问题是从前一段时间开始的,但我今天通过在更改Browsable属性后调用propertiesGrid.Refresh()来解决同样的问题。也许它可以帮助将来的某个人。