我仍在试验DynamicObjects。现在我需要一些信息:我试图将从DynamicObject继承的对象绑定到WPF DataGrid(而不是Silverlight)。使用自动列生成将DynamicObject绑定到DataGrid?
如何让DataGrid从通常在运行时生成的对象的可用公共属性中自动创建其列?这实际上可能吗?
我仍在试验DynamicObjects。现在我需要一些信息:我试图将从DynamicObject继承的对象绑定到WPF DataGrid(而不是Silverlight)。使用自动列生成将DynamicObject绑定到DataGrid?
如何让DataGrid从通常在运行时生成的对象的可用公共属性中自动创建其列?这实际上可能吗?
没有统一的方法来查询动态属性,通常预计您会提前知道它们。使用DynamicObject
,实现者可能会覆盖GetMemberNames
,并且通常会为您提供属性,但它确实意味着要进行调试,因为它没有要求提供所有属性。否则,如果它是你自己的DynamicObject
你只需要编写自己的方法来获取基于动态实现的属性。例如ExpandoObject
可让您使用IDictionary
接口查询所有属性。
所以一旦你有办法得到你的属性,你需要告诉DataGrid。不幸的是,对于DataGrid,执行ICustomTypeDescriptor
来告诉DataGrid有关你的属性的问题是DataGrid使用Type而不是实例来获取TypeDescriptors,这是Dynamic对象的一个问题,但是在DynamicObjects集合上实现ITypedList
将与如果你没有在你的集合上实现非通用的IList
接口,它会很小,但它会在它检测到ITypeList
之前被删除。
所以总之,实施一个集合ITypedList
和IList
。用ITypedList
为GetListName
返回null,只是实现GetItemProperties(PropertyDescriptor[] listAccessors)
;忽略listAccessors
,并根据列表中最好表示的动态对象实例(很可能只是第一个对象)为每个成员返回PropertyDescriptor的PropertyDescriptorCollection。你必须要实现的PropertyDescriptor的子类,一个简单和通用的方式来了get/set值是使用开源框架Dynamitey
using System;
using System.ComponentModel;
using Dynamitey;
public class DynamicPropertyDescriptor:PropertyDescriptor
{
public DynamicPropertyDescriptor(string name) : base(name, null)
{
}
public override bool CanResetValue(object component)
{
return false;
}
public override object GetValue(object component)
{
return Dynamic.InvokeGet(component, Name);
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
Dynamic.InvokeSet(component, Name, value);
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override Type ComponentType
{
get { return typeof(object); }
}
public override bool IsReadOnly
{
get { return false; }
}
public override Type PropertyType
{
get
{
return typeof (object);
}
}
}
我认为DataGrid
使用TypeDescriptor
来获取对象属性来创建列。所以如果你的DynamicObject
执行ICustomTypeDescriptor
,你应该能够达到这个目标。实施GetProperties
方法,以便它返回对象的动态属性。
这是去使用Silverlight在任何情况下的方式,如SL没有按”没有'ITypedList'。 – McGarnagle 2013-04-30 16:20:16
这也适用于winforms。非常感谢你! – swe 2016-07-29 16:47:16