Как я могу переопределить поведение сетки свойств Winforms DockStyle Editor

исал PCL с пользовательскими объектами там, а затем я создаю графический интерфейс, который обрабатывает объекты из PCL ... и я пытаюсь использовать PropertyGrid для редактирования свойств ... Я уже прочитал это для сетки чтобы знать, что делать с объектом, мне нужно указать EditorAttribute, а также предоставить TypeConverter ... но я не думаю, что смогу добавить эти 2 в PCL ...

Есть ли способ справиться с этим на уровне графического интерфейса, например, указав PropertyGrid использовать определенный тип Editor / TypeConverter во время выполнения? Я просмотрел список доступных функций / свойств сетки и не выглядит возможным.

 Sinatr07 сент. 2017 г., 17:28
Смотреть вICustomTypeDescriptor, это позволит вам динамически предоставлять информацию о типе во время выполнения. А именно свойства и их атрибуты. Google для "таблицы свойств icustomtypedescriptor c #".
 Reza Aghaei07 сент. 2017 г., 20:22
Регистрация кастомаTypeDescriptionProvider во время выполнения - это то, что вы ищете. Вы можете создатьTypeDescriptionProvider а такжеTypeDescriptor самостоятельно, а затем зарегистрируйте провайдера в своем классе и предоставьте описание пользовательского типа, используя класс дескриптора типа, который вы создали. Также, как более понятный и простой вариант, вы можете создать класс метаданных, содержащий те же свойства, что и ваш исходный класс, и украсить свойства класса метаданных некоторыми атрибутами. Тогда используйтеAssociatedMetadataTypeTypeDescriptionProvider предоставить описание типа для вашего класса, используя класс метаданных.
 codenamezero07 сент. 2017 г., 17:36
Да, но вам не нужно добавлятьTypeConverter или реализоватьICustomTypeDescriptor в самом объектном классе?ICustomTypeDescriptor это не PCL, хотя.

Ответы на вопрос(1)

Решение Вопроса

содержащий те же свойства, что и ваш исходный класс, и украсить свойства класса метаданных некоторыми атрибутами. Затем скажите дескриптору типа использовать класс метаданных для предоставления описания типа для вашего исходного класса:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof(MyClass),
    typeof(MyClassMetadata));
TypeDescriptor.AddProvider(provider, typeof(MyPortableClass));

PropertyGrid Элемент управления использует дескриптор типа вашего класса, чтобы показать свойства вашего класса, их отображаемое имя, их описание, их редактор и так далее. Вы можете назначить дескриптор типа по-разному.

В вашем случае лучшим решением будет регистрация новогоTypeDescriptorProvider для вашего класса во время выполнения. Таким образом, вы можете изменить внешний вид вашего класса вPropertyGrid просто во время выполнения.

С помощьюAssociatedMetadataTypeTypeDescriptionProvider Вы можете создать провайдер дескриптора типа для вашего класса, который использует класс метаданных для предоставления описания типа. Тогда вы можете зарегистрировать провайдера, используяTypeDescriptor.AddProvider.

Таким образом, вы можете ввести класс метаданных для вашего класса, который содержит атрибуты для свойств.

Шаг за шагом Пример

Добавьте переносимую библиотеку классов в решение и добавьте в нее класс:

public class MyClass
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Добавьте ссылку на переносимую библиотеку классов в ваш проект Windows Forms. Просто убедитесь, что целевая структура соответствует.

ДобавлятьSystem.Design а такжеSystem.ComponentModel.DataAnnotations ссылки на ваш проект Windows Forms.

В Windows Forms Project добавьте класс метаданных для вашего переносимого класса. Класс должен содержать точно такие же свойства вашего исходного класса:

public class MyClassMetadata
{
    [Category("My Properties")]
    [DisplayName("First Property")]
    [Description("This is the first Property.")]
    public string Property1 { get; set; }

    [Category("My Properties")]
    [DisplayName("Second Property")]
    [Description("This is the second Property.")]
    [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
    public string Property2 { get; set; }
}

Вы должны добавить эти использования:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.Design;
using System.Drawing.Design; 

ВLoad событие вашей формы, зарегистрируйте провайдера метаданных для вашего типа следующим образом:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof(MyClass),    
    typeof(MyClassMetadata));
TypeDescriptor.AddProvider(provider, typeof(MyClass));

Покажите экземпляр вашего переносимого класса в сетке свойств:

var myObject = new MyClass();
this.propertyGrid1.SelectedObject = myObject ;

Вот результат после запуска приложения:

 Reza Aghaei08 сент. 2017 г., 23:13
 codenamezero07 сент. 2017 г., 22:02
Черт возьми, позвольте мне попробовать это решение и доложить, хотя мне не нравится тот факт, что для каждого объекта мне нужно создать для него мета-объект ... Я думаю, что нет никакого способа обойти это ...
 Reza Aghaei07 сент. 2017 г., 22:08
В качестве другого альтернативного решения вы можете определить свои собственные атрибуты в переносимом классе, а затем заменить их во время выполнения, используяTypeDescriptor механизм. Например, посмотрите на мой пост здесь:Объединение нескольких атрибутов в один атрибут.
 Reza Aghaei07 сент. 2017 г., 22:02
Я считаю, что это самый чистый путь :)
 Reza Aghaei07 сент. 2017 г., 22:05
Обычно используется в решениях ASP.NET MVC. Например, если у вас есть какая-то сущность, сгенерированная с использованием Entity Framework (с использованием edmx), вы не можете (не должны) украшать свойства сгенерированной сущности атрибутами. Вместо этого вы создаете эти классы метаданных.

Ваш ответ на вопрос