我仍在尝试使用 DynamicObjects。现在我需要一些信息:我正在尝试将从 DynamicObject 继承的对象绑定(bind)到 WPF DataGrid(不是 Silverlight)。
如何让 DataGrid 从通常在运行时生成的对象的可用公共(public)属性中自动创建其列?这实际上可能吗?
最佳答案
查询动态属性没有统一的方法,通常希望您提前知道它们。与 DynamicObject
, 实现者可以覆盖 GetMemberNames
这通常会为您提供属性,但是它实际上是用于调试的,因为不需要它提供所有属性。否则如果是你自己的DynamicObject
您只需要编写自己的方法即可根据您的动态实现获取属性。例如 ExpandoObject
允许您使用 IDictionary
查询所有属性界面。
所以一旦你有办法获得你的属性,你需要告诉 DataGrid。不幸的是,使用 DataGrid,实现 ICustomTypeDescriptor
的问题告诉 DataGrid 你的属性是 DataGrid 使用 Type 而不是实例获取 TypeDescriptors,这对于动态对象来说是一个问题,但是实现 ITypedList
如果你不实现非泛型 IList
接口(interface),它将在到达检查 ITypeList
的位置之前被删除.
总而言之,使用 ITypedList
实现集合和 IList
.与 ITypedList
为 GetListName
返回 null并执行GetItemProperties(PropertyDescriptor[] listAccessors)
;忽略 listAccessors
并为每个成员返回一个 PropertyDescriptorCollection 的 PropertyDescriptors,该成员根据列表中表现最好的 Dynamic 对象实例(很可能只是第一个对象)命名。您必须实现 PropertyDescriptor 的子类,获取/设置值的简单通用方法是使用开源框架 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);
}
}
}
关于wpf - 将 DynamicObject 绑定(bind)到具有自动列生成的 DataGrid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473739/