提供一种为用户配置对象树的方法最简单的方法是什么?

时间:2011-11-11 15:48:31

标签: c# winforms user-interface

所以我有一个与此类似的对象树:

AbstractA
    string PropA
    int PropB
    AbstractC PropC
    AbstractD PropD

AbstractB
    string PropA
    string PropB

AbstractC : AbstractB
    string PropC

AbstractD : AbstractB
    int PropC

ConcreteA1 : AbstractA
    int PropE

ConcreteC1 : AbstractC
    bool PropD

ConcreteC2 : AbscractC
    decimal PropD

ConcreteD1 : AbstractD
    string PropD
ConcreteD2 : AbstractD
    long PropD

我遇到的问题是找到一种全面的方法来为用户提供配置对象树的能力。有多个具体的类可以扩展我的摘要,我想不要为每个具体类型构建用户控件。要在混合中添加一个额外的约束,类定义来自我的WCF代理类。如果可能的话,我想避免滚动我自己的代理/模型定义,但如果实现我的目标的唯一方法就是这样做那么就这样吧。

我最初尝试使用PropertyGrid,但我对它的了解相当薄弱,昨晚我搜索任何好的例子都没有太多运气。

2 个答案:

答案 0 :(得分:1)

听起来你在互动的两边都使用.net并控制双方。如果是这种情况,您可以将合同放入由服务和客户端引用的公共程序集中,而不是使用生成的代理,而不是使用生成的代理,而不是生成代理类,从而可以完全控制类正在使用并且能够使用您想要的任何属性。

答案 1 :(得分:0)

为避免为每种类型构建控件,您需要对每个对象的属性使用反射,并将数据转换为易于操作的字符串。具有两列的网格控件,左侧为属性名称,右侧为其值(作为字符串)。进行编辑时,将值转换为正确的类型。每种基类型都有一个相对容易访问的继承转换器。

您的grid / listview需要是属性列表,并且这些属性需要映射到您的类实例。对象列表将表示项目的每个属性(您的具体对象)。对象列表需要记住一些内容,项目,属性的属性信息和值,以及您希望网格基于属性信息执行的任何其他操作。

使用Reflection和TypeConverter,您可以获取每个属性并编辑它们的值,从而创建一个控件(类实例的属性的网格/列表视图)来编辑任何类。