Привязка DynamicObject к DataGrid с автоматическим созданием столбцов?

StackOverflow https://stackoverflow.com/questions/2473739

Вопрос

Я все еще экспериментирую с DynamicObjects.Теперь мне нужна информация:Я пытаюсь привязать объект, наследующий от DynamicObject, к DataGrid WPF (не Silverlight).

Как заставить DataGrid автоматически создавать столбцы из доступных общедоступных свойств объекта, которые обычно генерируются во время выполнения?Возможно ли это на самом деле?

Это было полезно?

Решение

Не существует единого способа запроса динамических свойств, обычно ожидается, что вы знаете их заранее.С DynamicObject, разработчики могут переопределить GetMemberNames и это обычно дает вам свойства, однако на самом деле оно предназначено для отладки, поскольку не требуется, чтобы оно предоставляло все свойства.В противном случае, если это ваше собственное DynamicObject вам просто нужно написать свой собственный метод для получения свойств на основе вашей динамической реализации.Например ExpandoObject позволяет запрашивать все свойства, используя IDictionary интерфейс.

Итак, как только у вас появится способ получить свои свойства, вам нужно сообщить об этом DataGrid.К сожалению, с DataGrid проблема с реализацией ICustomTypeDescriptor Чтобы сообщить DataGrid о ваших свойствах, DataGrid получает TypeDescriptors, используя Type, а не экземпляр, что является проблемой для динамических объектов, однако реализация ITypedList в коллекции DynamicObjects будет работать с очень маленькой проблемой, если вы не реализуете неуниверсальный IList интерфейс в вашей коллекции, он будет удален до того, как достигнет точки, где будет проверяться ITypeList.

Итак, реализуйте коллекцию с помощью ITypedList и IListITypedList вернуть ноль для GetListName и просто реализовать GetItemProperties(PropertyDescriptor[] listAccessors);игнорировать listAccessors и верните PropertyDescriptorCollection PropertyDescriptors для каждого члена, названного на основе наиболее представленного экземпляра динамического объекта в вашем списке (скорее всего, только первого объекта).Вам необходимо реализовать подкласс PropertyDescriptor, простой и общий способ получить значение Get/Set — использовать платформу с открытым исходным кодом. Динамитей

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