通过自动列生成将DynamicObject绑定到DataGrid?

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)