Привязка DynamicObject к DataGrid с автоматическим созданием столбцов?
-
20-09-2019 - |
Вопрос
Я все еще экспериментирую с DynamicObjects.Теперь мне нужна информация:Я пытаюсь привязать объект, наследующий от DynamicObject, к DataGrid WPF (не Silverlight).
Как заставить DataGrid автоматически создавать столбцы из доступных общедоступных свойств объекта, которые обычно генерируются во время выполнения?Возможно ли это на самом деле?
Решение
Не существует единого способа запроса динамических свойств, обычно ожидается, что вы знаете их заранее.С DynamicObject
, разработчики могут переопределить GetMemberNames
и это обычно дает вам свойства, однако на самом деле оно предназначено для отладки, поскольку не требуется, чтобы оно предоставляло все свойства.В противном случае, если это ваше собственное DynamicObject
вам просто нужно написать свой собственный метод для получения свойств на основе вашей динамической реализации.Например ExpandoObject
позволяет запрашивать все свойства, используя IDictionary
интерфейс.
Итак, как только у вас появится способ получить свои свойства, вам нужно сообщить об этом DataGrid.К сожалению, с DataGrid проблема с реализацией ICustomTypeDescriptor
Чтобы сообщить DataGrid о ваших свойствах, DataGrid получает TypeDescriptors, используя Type, а не экземпляр, что является проблемой для динамических объектов, однако реализация ITypedList
в коллекции DynamicObjects будет работать с очень маленькой проблемой, если вы не реализуете неуниверсальный IList
интерфейс в вашей коллекции, он будет удален до того, как достигнет точки, где будет проверяться ITypeList
.
Итак, реализуйте коллекцию с помощью ITypedList
и IList
.С ITypedList
вернуть ноль для 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
метод, чтобы он возвращал динамические свойства вашего объекта.