【问题标题】:How to display objects with dynamic fields in wpf data grid?如何在 wpf 数据网格中显示具有动态字段的对象?
【发布时间】:2011-01-31 11:41:28
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net wpf dynamic


    【解决方案1】:

    我会在我的界面上这样做

    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】:

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

    我的建议是这样的:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多