以编程方式过滤自定义属性

时间:2013-01-17 14:47:27

标签: c# wpf properties propertygrid

我有一个现有的自定义控件库,其中包含可能包含属性的控件:HeaderStyle,ModalStyle,Collapsable等...

在用户界面中,程序当前正在显示这些属性的分类列表。我试图更新此代码以隐藏他们通常不使用的属性。我有一个基于按钮单击隐藏/显示的属性列表,但我不确定如何以编程方式隐藏这些字段。

我想保留在隐藏之前输入到字段中的任何值,如果再次显示字段,则重新显示值。

这是一个当前存在但希望隐藏/显示在切换上的属性。

/// <summary>ModalStyle property for control</summary>
[XmlAttribute]
[DefaultValue(Utility.Common.Enumerations.ModalStyle.None)]
[Category(PropertyCategories.Rendering)]
[Description("Modal dialog style")]
public ModalStyle? ModalStyle
{
get { return control.ModalStyleActive; }
set { control.ModalStyle = value; }
}

我原来的是在#if DEBUG上做一些变种,但是使用我自己的Conditional但是我无法通过按钮/切换来找到改变条件的方法。

任何人都可以帮助解决我的问题吗?我有20-30个控件,有20到30个想要过滤的属性。

2 个答案:

答案 0 :(得分:1)

我有两条建议,虽然它们可能无法为您提供所需的确切功能,但会让您的解决方案更直接。

第一: 由于您是库开发人员,因此您应该通过IDE属性窗口确定您希望其他开发人员可以访问哪些属性。如果一个属性很少使用或通过IDE非常有用,那么只需在其上放置[Browsable(false)]属性。

第二: 如果您确实希望在IDE属性窗口中显示所有属性,但希望为个人提供隐藏更高级(或更少使用)属性的方法,则只需将它们全部放在“高级”类别中即可。然后,用户可以简单地折叠该类别并忘记它们。

另外:看看Oliver对这个问题的回答: [how-to-show-or-hide-properties-dynamically-in-the-propertygrid]

答案 1 :(得分:0)

我不确定你想要达到的目的。

使用属性时,它们对类是静态的。因此,在您的情况下,当您在对象上切换显示/隐藏时,它位于对象的实例上。此外,您无法在运行时更改属性值。

也许您应该尝试另类解决方案,例如创建全局

map<pair<type of object, property name>, is shown>

并从编辑器中相应地更新。

如果你想使用类似属性网格的东西,你会遇到问题,因为它不会检查你的地图,但它可以修复。您可以在运行时创建一个新类,并使其成为当前实例的代理。 (检查网络如何实现,但它很简单。有两种可能:从字符串编译或使用ILGenerator。

希望得到这个帮助。