我仍然与DynamicObjects实验。现在我需要一些信息:我想绑定的对象从DynamicObject继承到一个WPF的DataGrid(不Silverlight的)。

我要如何将DataGrid从在运行时通常生成的对象的可用的公共属性自动创建其列?这是可能的实际?

有帮助吗?

解决方案

有是查询动态性能没有统一的方法,一般它的预期,你知道他们的时间提前。随着DynamicObject,实施者可以覆盖GetMemberNames以及通常给你的属性,但它确实是用于调试,因为没有需求,它提供的所有属性。否则,如果这是你自己DynamicObject你只需要编写自己的方法来获得基于动态执行特性。例如ExpandoObject,您可以查询使用IDictionary接口的所有属性。

所以一旦你有办法让你的属性,你需要告诉DataGrid中。不幸的是有一个DataGrid,与实施ICustomTypeDescriptor告诉DataGrid的有关性质的问题是,DataGrid的使用类型不是实例,它是动态的对象问题得到TypeDescriptors,但是在DynamicObjects收集实施ITypedList将与合作如果你不执行你的集合非通用IList界面非常微小的疑难杂症,也将被清除掉它到达的地方检查ITypeList点之前。

因此,在总结,实施与ITypedListIList的集合。随着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方法,以便它返回的对象的动态特性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top