PropertyGrid - 显示特定接口的属性,而不是所有属性

时间:2017-12-07 13:21:55

标签: c# .net winforms propertygrid

我目前面临PropertyGrid

的(IMHO)奇怪行为

我有一个定义了一些属性的接口(ITest)。此界面将由ComponentPanelTestImpl)实施。另一部分是ComponentTestComponent),它具有接口类型的公共属性。默认实现将分配给该属性,并且可以由用户更改为更具体的实现。如果我将此TestComponent添加到Form,我希望通过扩展public-interface-property,只有界面中声明的属性可见 - 而{{1}的所有属性}}或Panel是可见的......

Component

有没有办法只显示界面属性?

1 个答案:

答案 0 :(得分:2)

默认情况下,

PropertyGrid显示控件的所有公共属性的显示名称,这些属性是可浏览的。它使用对象的TypeDescriptor询问其元数据,包括其可浏览属性和显示名称。

要自定义此行为,您需要为对象注册新的TypeDescriptionProvider

示例

在以下示例中,我创建了一个MyPanel控件,该控件派生自Panel并实现IMyInterface。然后我创建了一个自定义MyTypeDescriptionProvider<T>并将MyTypeDescriptionProvider<IMyInterface>设置为我的控件的TypeDescriptionProvider

这样,当您将MyPanel的实例设置为SelectedObject的{​​{1}}时,PropertyGrid中只会显示IMyInterface的属性。< / p>

PropertyGrid

注意:作为一个重要提示,请记住,此类功能根本不适用于设计时间。因为在设计时,您需要在设计器的using System; using System.ComponentModel; using System.Windows.Forms; public interface IMyInterface { string MyProperty1 { get; set; } string MyProperty2 { get; set; } } public class MyTypeDescriptionProvider<T> : TypeDescriptionProvider { public MyTypeDescriptionProvider() : base(TypeDescriptor.GetProvider(typeof(T))) { } public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) { return base.GetTypeDescriptor(typeof(T), instance); } } [TypeDescriptionProvider(typeof(MyTypeDescriptionProvider<IMyInterface>))] public class MyPanel : Panel, IMyInterface { public string MyProperty1 { get; set; } public string MyProperty2 { get; set; } } 中显示控件的属性,并且您需要让设计人员知道这些属性能够为它们序列化值。