我目前面临PropertyGrid
:
我有一个定义了一些属性的接口(ITest
)。此界面将由Component
或Panel
(TestImpl
)实施。另一部分是Component
(TestComponent
),它具有接口类型的公共属性。默认实现将分配给该属性,并且可以由用户更改为更具体的实现。如果我将此TestComponent
添加到Form
,我希望通过扩展public-interface-property,只有界面中声明的属性可见 - 而{{1}的所有属性}}或Panel
是可见的......
Component
有没有办法只显示界面属性?
答案 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; }
}
中显示控件的属性,并且您需要让设计人员知道这些属性能够为它们序列化值。