我有一个应用程序,需要在其中编辑一些数据,而 PropertyGrid 结构在视觉上是满足我的需求的最佳选择。但是,PropertyGrid 获取对象的公共(public)属性并将它们显示在网格中。 (带有属性的附加选项)。但是,我没有这样的对象,因为我需要编辑的键值对列表是动态的。
理想的解决方案是这样的:
public class GridParam
{
// ... several constructors here, one for each type
// ... or a single one but with generic class, does not matter
public String Name { get; set; }
public Object Value { get; set; }
public Type ItemType { get; set; }
}
GridParam stringParam = new GridParam("Address", "2534 Barkeley Av.");
GridParam numberParam = new GridParam("Year", 2012);
NewKindOfPropertyGrid grid = new NewKindOfPropertyGrid();
grid.AddParam(stringParam);
grid.AddParam(numberParam);
上面的代码将生成一个如下所示的属性网格:
PropertyGrid 或任何其他现有控件是否可以实现类似的功能(至少看起来与 PG 类似)? 语法不必与我编写的类似,但它需要能够接受此类动态属性的集合,而无需定义类...
最佳答案
这里有两个选择。
第一个(在我看来更简单)是实现 ICustomTypeDescriptor
interface在一个需要 IEnumerable<T>
的类(class)上您的GridParam
实例。
PropertyGrid
class实际上并没有直接使用反射;相反,它使用 TypeDescriptor
class获取有关对象实例的元数据,默认情况下使用反射。
但是,如果您实现ICustomTypeDescriptor
,然后 PropertyGrid
将获得从 TypeDescriptor
获得的所有信息从你的实现。您只需向其提供您希望其显示的内容即可。
因此在这种情况下,您将拥有 GetProperties
执行返回一个 PropertyDescriptorCollection
填充有 PropertyDescriptor
对于您的每个 GridParam
实例。
另一个(可能)更困难的选项是动态创建类型,并将其绑定(bind)到该类型(因为 PropertyGrid
需要一个 object
来绑定(bind))。当然,您确实在某种程度上复制了 ICustomTypeDescriptor
的实现的大部分内容。会做,所以最好选择前者。
关于c# - PropertyGrid 可以在没有对象的情况下使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289456/