结合DynamicObject与自动列生成一个DataGrid?
-
20-09-2019 - |
题
我仍然与DynamicObjects实验。现在我需要一些信息:我想绑定的对象从DynamicObject继承到一个WPF的DataGrid(不Silverlight的)。
我要如何将DataGrid从在运行时通常生成的对象的可用的公共属性自动创建其列?这是可能的实际?
解决方案
有是查询动态性能没有统一的方法,一般它的预期,你知道他们的时间提前。随着DynamicObject
,实施者可以覆盖GetMemberNames
以及通常给你的属性,但它确实是用于调试,因为没有需求,它提供的所有属性。否则,如果这是你自己DynamicObject
你只需要编写自己的方法来获得基于动态执行特性。例如ExpandoObject
,您可以查询使用IDictionary
接口的所有属性。
所以一旦你有办法让你的属性,你需要告诉DataGrid中。不幸的是有一个DataGrid,与实施ICustomTypeDescriptor
告诉DataGrid的有关性质的问题是,DataGrid的使用类型不是实例,它是动态的对象问题得到TypeDescriptors,但是在DynamicObjects收集实施ITypedList
将与合作如果你不执行你的集合非通用IList
界面非常微小的疑难杂症,也将被清除掉它到达的地方检查ITypeList
点之前。
因此,在总结,实施与ITypedList
和IList
的集合。随着ITypedList
返回空值GetListName
,只是实施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
方法,以便它返回的对象的动态特性。