Hen*_*ese 10 data-binding wpf datagrid dynamicobject c#-4.0
我还在尝试使用DynamicObjects.现在我需要一些信息:我正在尝试将从DynamicObject继承的对象绑定到WPF DataGrid(而不是Silverlight).
如何让DataGrid从通常在运行时生成的对象的可用公共属性中自动创建其列?这可能吗?
jbt*_*ule 11
没有统一的方法来查询动态属性,通常预计您会提前知道它们.随着DynamicObject
,实施者可以覆盖GetMemberNames
和一般让你的特性,但它确实是用于调试,因为没有它提供的所有性能要求.否则,如果它是您自己的,DynamicObject
您只需编写自己的方法即可根据动态实现获取属性.例如ExpandoObject
,您可以使用IDictionary
界面查询所有属性.
因此,一旦有了获取属性的方法,就需要告诉DataGrid.不幸的是,对于DataGrid,实现ICustomTypeDescriptor
告诉DataGrid有关属性的问题是DataGrid使用Type而不是实例来获取TypeDescriptors,这对于Dynamic对象来说是一个问题,但是ITypedList
在DynamicObjects集合上实现将适用于非常小的如果你没有IList
在你的集合上实现非泛型接口,那么它会在它到达检查点之前被剥离掉ITypeList
.
总而言之,使用ITypedList
和实现集合IList
.有了ITypedList
回报为null GetListName
,公正实施 GetItemProperties(PropertyDescriptor[] listAccessors)
; 忽略listAccessors
并返回基于列表中最佳表示的动态对象实例(最可能只是第一个对象)命名的每个成员的PropertyDescriptors的PropertyDescriptorCollection.你必须实现PropertyDescriptor的子类,Get/Set值的一种简单而通用的方法是使用opensource框架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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8510 次 |
最近记录: |