我想在WPF数据网格中显示和编辑一些对象,我正在寻找一种好方法。我想要显示的所有对象都具有相同的字段,但每次执行时我的对象的字段都可能不同。这是一个界面来说明我的意思:
public interface IMyObject
{
IEnumerable<string> GetFieldNames();
IEnumerable<Type> GetFieldTypes();
object GetField(string name);
void SetField(string name, object value);
}
如何生成显示此类对象的数据网格?我想到XAML生成来定义列,但我仍然面临访问字段的问题。我想我可以通过值转换器实现这一点,另一个选择是动态创建一个用属性公开动态字段的类型。
还有其他方法吗?我应该支持哪些方式?我很想听听你的意见。
最诚挚的问候,
Oliver Hanappi
答案 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列,那么它将为您创建列。然而,这可能会导致一些相当不理想的结果。
我的建议是:
这种方法取决于集合中所有相同类型的项目,但应该合理地活泼。 如果集合中有不同的项目,并且它们很少或没有共性,那么您可以查看查询每个项目的可绑定属性的方法,然后将所有项目混合在一起。