代码之家  ›  专栏  ›  技术社区  ›  Oliver Hanappi

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

  •  2
  • Oliver Hanappi  · 技术社区  · 15 年前

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

    public interface IMyObject
    {
        IEnumerable<string> GetFieldNames();
        IEnumerable<Type> GetFieldTypes();
    
        object GetField(string name);
        void SetField(string name, object value);
    }
    

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

    还有其他的方法吗?我应该喜欢哪一种?我很想听听你的意见。

    最好的问候,
    奥利弗哈纳皮

    2 回复  |  直到 15 年前
        1
  •  4
  •   Aran Mulholland JohnnyAce    15 年前

    我会对我的界面做这个

    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;
    }
    

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

        2
  •  0
  •   slugster Joey Cai    15 年前

    每次绑定对象的类型都会改变这一事实并不重要,如果网格设置为自动生成列,那么它将为您创建列。然而,这可能会导致一些相当不好的结果。

    我的建议是:

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

    这种方法依赖于集合中的所有项都是同一类型的,但应该是相当迅速的。 如果集合中有不同的项,它们几乎没有共性,或者没有共性,那么您可以寻找一种方法,在该方法中查询每个项的可绑定属性,然后将整个批混合在一起。