wpf - 将 DynamicObject 绑定(bind)到具有自动列生成的 DataGrid?

标签 wpf data-binding datagrid c#-4.0 dynamicobject

我仍在尝试使用 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 .与 ITypedListGetListName 返回 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/

相关文章:

svg - Angular2 Svg 文本属性绑定(bind)

c# - 高亮显示找到的单元格

jquery - Asp.Net MVC 2 带有集合的对象注册表单

silverlight - 使 Silverlight Datagrid 单元格不可选择

apache-flex - 如何使 datagrid 高度等于 Adob​​e Flex 中的数据内容

wpf - App.Xaml的 View 模型

c# - 以编程方式创建缓动函数 C#

c# - WPF中的GroupBox只能包含一个元素?

c# - session 结束事件不起作用

android - android绑定(bind)数据的通用形式