如何在wpf数据网格中显示带有动态字段的对象?

时间:2010-03-24 21:55:44

标签: c# .net wpf dynamic

我想在WPF数据网格中显示和编辑一些对象,我正在寻找一种好方法。我想要显示的所有对象都具有相同的字段,但每次执行时我的对象的字段都可能不同。这是一个界面来说明我的意思:

public interface IMyObject
{
    IEnumerable<string> GetFieldNames();
    IEnumerable<Type> GetFieldTypes();

    object GetField(string name);
    void SetField(string name, object value);
}

如何生成显示此类对象的数据网格?我想到XAML生成来定义列,但我仍然面临访问字段的问题。我想我可以通过值转换器实现这一点,另一个选择是动态创建一个用属性公开动态字段的类型。

还有其他方法吗?我应该支持哪些方式?我很想听听你的意见。

最诚挚的问候,
Oliver Hanappi

2 个答案:

答案 0 :(得分:4)

我会这样做到我的界面

public interface IMyObject
{
    IEnumerable<string> GetFieldNames();
    IEnumerable<Type> GetFieldTypes();

    //i would add this property, then you can bind directly to it.
    //basically it is a collection indexer, indexed by string
    object this[String name] { get; set; }

    object GetField(string name);
    void SetField(string name, object value);
}

我会在代码中构建列,如此,(其中stringKeyCollection是从GetFieldNames()返回的字符串的集合 - 尽管我个人会将此信息与我的对象分开 - 就像主定义一样)

foreach(String item in stringKeyCollection){
   //create the base column (use whatever column type you want
   DataGridBoundColumn column = new DataGridBoundColumn();
   //create the binding for the column
   column.Binding = new Binding("[" + item + "]");
   //set the header
   column.Header = item;
}

然后在网格的每个单元格中都有对象,您可以根据需要定义模板。

答案 1 :(得分:0)

每次绑定对象的类型更改这一事实并不是非常重要,如果您的网格设置为AutoGenerate列,那么它将为您创建列。然而,这可能会导致一些相当不理想的结果。

我的建议是:

  • 使用您的数据对象,使用自定义属性为每个可显示属性添加注释,这只是为了标记它以供以后检查
  • 获得项目集合后,取出列表中的第一项并将其传递给返回网格列的工厂函数
  • 网格列工厂函数可以使用反射检查数据对象,查找具有您之前使用的特殊属性的属性,并使用适当的绑定和值转换器创建相应的网格列
  • 将网格列的集合添加到网格中,并绑定数据

这种方法取决于集合中所有相同类型的项目,但应该合理地活泼。 如果集合中有不同的项目,并且它们很少或没有共性,那么您可以查看查询每个项目的可绑定属性的方法,然后将所有项目混合在一起。