ICustomTypeDescriptor, TypeDescriptionProvider, TypeConverter и UITypeEditor
-
09-09-2019 - |
Вопрос
Я пытаюсь получить общее представление о том, как вы используете ICustomTypeDescriptor, TypeDescriptionProvider, TypeConverter и UITypeEditor, чтобы изменить способ отображения PropertyGrid и взаимодействия с объектом.
Может ли кто-нибудь сказать мне, правильно ли это, или я упустил какие-либо важные концепции или моменты?На самом деле я просто пытаюсь понять, почему и когда вы будете использовать каждый класс.
ICustomTypeDescriptor
- Реализация этого интерфейса в классе полностью переопределяет собственные свойства класса и заменяет их PropertyDescriptors, возвращаемыми ICustomTypeDescriptor.GetProperties().
ТипОписаниеПоставщик
- Используется для расширения существующих свойств класса.
- TypeDescriptionProvider добавляется к классу через атрибут TypeDescriptionProvider.
- Метод GetTypeDescriptor() класса TypeDescriptionProvider возвращает ICustomTypeDescriptor, который будет добавлено к существующим свойствам типа.
- PropertyGrid покажет как свойства класса, найденные с помощью Reflection, так и свойства, добавленные в класс через TypeDescriptionProvider.
ТипКонвертер
- Преобразует между типами
- Что касается использования PropetyGrid, используемого для преобразования между сложными типами и примитивными типами, которые можно отображать/редактировать в сетке свойств.
- Метод значений GetStandard TypeConverter также можно использовать для отображения списка возможных значений в сетке свойств.
Редактор UIType
- Определяет пользовательский редактор для управления свойством сложного типа.
- Связано со свойством через атрибут.
Таким образом, ICustomTypeDescriptor и поставщик TypeDescription используются для добавления/изменения/замены целых свойств объектов.TypeConverter и UITypeEditor применяются к отдельным свойствам и управляют взаимодействием с этими конкретными свойствами.
Решение
Твики:
TypeDescriptionProvider
- все еще заменяет метаданные (не расширяются)
- также можно добавить
TypeDescriptor.AddProvider
- может применяться как для каждого типа, так и для каждого экземпляра, что позволяет применять к спискам без необходимости реализации
ITypedList
TypeConverter
- для
PropertyGrid
, это также механизм, используемый для получения метаданных;Обратите внимание, чтоExpandableObjectConverter
просто делегируетTypeDescriptor.GetProperties
, но это не всегда так - также отвечает за воссоздание неизменяемых объектов (таких как структуры) с изменениями.
- для
UITypeEditor
- также отвечает за рисование окна предварительного просмотра в
PropertyGrid
- также отвечает за рисование окна предварительного просмотра в
Дополнительный:
IExtenderProvider
- добавляет характеристики;возможно, это то, что вы путаетеTypeDescriptionProvider
ITypedList
- в целом близнецICustomTypeDescriptor
, но для списков;можно избежать, используяTypeDescriptionProvider
и необъектный индексатор на любомIList
, т.е.public T this[int index] {get;}
IListSource
- обеспечивает косвенность между источником данных и данными;например,DataTable
реализуетIListSource
, возвращаясьDefaultView
по запросу