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

3

我希望在WPF数据表格中显示和编辑一些对象,并且正在寻找一个好的方法来实现。我想要显示的所有对象都有相同的字段,但每次执行时我的对象的字段可能会不同。下面是界面的一部分,以说明我的意思:

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

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

我该如何生成一个显示这种对象的数据网格?我考虑使用XAML生成来定义列,但我仍然面临着访问字段的问题。我认为我可以使用值转换器实现这个功能,另一个选项是动态创建类型,通过属性公开动态字段。
还有其他方法吗?我很想听听你的意见。
最好的问候, Oliver Hanappi
2个回答

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

那么你在网格的每个单元格中都有对象,可以根据您的意愿定义模板。


我之前不知道可以绑定对象的索引器。我认为这个解决方案最适合我的需求。 - Oliver Hanappi

0

你绑定对象的类型每次都发生变化并不是非常重要,如果你的网格设置为自动生成列,则它会为你创建列。然而,这可能导致一些相当不美观的结果。

我建议的做法是:

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

这种方法依赖于集合中的所有项目具有相同的类型,但应该相当快速。 如果集合中有不同类型的项目,并且它们几乎没有共同之处,那么你可以考虑查询每个项目的可绑定属性,然后将它们整合在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接