【问题标题】:Programmatically filter custom properties以编程方式过滤自定义属性
【发布时间】:2013-01-17 14:47:27
【问题描述】:

我有一个现有的自定义控件库,其中包含可能包含属性的控件: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 上做一些变体,但使用我自己的条件,但是我无法找到通过按钮/切换来更改条件的方法。

谁能帮我解决我的问题?我有 20-30 个控件,其中包含 20 到 30 个要过滤的属性。

【问题讨论】:

  • 如何显示属性?该代码将需要隐藏其中一些,您不应该修改原始对象。
  • 我使用的是 winForms:PropertyGrid。
  • 也许解决方案在于[Browsable]的路径?是否可以打开和关闭 [Browsable]?

标签: c# wpf properties propertygrid


【解决方案1】:

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

首先: 由于您是库开发人员,您只需决定希望其他开发人员通过 IDE 属性窗口访问哪些属性。如果通过 IDE 很少使用或不是很有用的属性,那么只需在其上放置 [Browsable(false)] 属性即可。

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

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

【讨论】:

  • 我希望链接引用一个链接,目前正在阅读它。
  • 奥利弗斯的回答很好。他的 PropertyBag 课程真的打了我的脸。我可以很容易地在用户设置屏幕中保存他们喜欢哪些字段的用户设置。然后只从主列表中提取这些属性很简单。我遇到的一个问题是,以这种方式包含的所有属性都显示为只读...
【解决方案2】:

我不确定你想达到什么目的。

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

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

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

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

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

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2016-06-12
    • 2010-11-11
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多