Dll создания представления (C#/wpf) [дубликат]

401
14 сентября 2017, 14:18

На данный вопрос уже ответили:

  • Способы создания объектов в C# 2 ответа

Есть небольшой проект git repository, который позволяет формировать шаблоны wpf для объектов.

Есть dll которая позволяет формировать Ui из объектов.

Застопорился на формировании Ui для объекта типа Dictionary.

Может подскажете как лучше организовать Ui добавления нового элемента?

Вкратце, через рифлексию собирается информация о типе, его свойствах и атрибутах. Далее на основе собранной информации формируется DataTemplate. Если требуется, объект оборачивается в специальную viewModel, как это происходит со свойством типа Dictionary. ViewModel формирует привязку к свойству и предоставляет небольшой функционал для работы с этим свойством. Отображение данных настроил, но с добавлением проблема. Так как свойство типа Dictionary имеет два параметра типа Generic. В этом и вся загвоздка. Как создать ключ типа Generic да еще и из UI.

Распишу более подробно. Есть класс:

public class MyPresentation : Presentation
{
    public Dictionary<int, PresentationItem> dictionary { get; set; }
}

после запуска приложения генератор сформируется Ui для свойства dictionary:

Теперь хочу добавить возможность добавления нового элемента в Dictionary. не могу придумать как организовать панель добавления так как не знаю к какому типу будет относится TKey и как его отображать в ComboBox.

Answer 1

Автор, если тебе нужно понять, что объект является Dictionary<TKey, TValue> и получить типы его параметров, то ты можешь это сделать вот так:

Boolean IsDictionary(Object obj, out Type keyType, out Type valueType)
{
    keyType = null;
    valueType = null
    Type type = obj.GetType();
    if (!type.IsGenericType || type.IsGenericTypeDefinition)
        return false;
    Type genericType = type.GetGenericTypeDefinition();
    if (genericType  != typeof(Dictionary<,>)
        return false;
    Type[] genericArguments = type.GetGenericArguments();
    keyType = genericArguments[0];
    valueType = genericArguments[1];
    return true;
}

Конструировать сам Dictionary, как я понял из вопроса, тебе не нужно. Только его элементы. Но если вдруг это необходимо, то зная его тип, ты можешь получить его вызовом метода GetConstructor. Если же тип тебе неизвестен, но ты знаешь типы ключа и значения, то тебе поможет метод MakeGenericType, который ты должен вызвать на GenericTypeDefinition - в твоём случае так: typeof(Dictionary<,>).MakeGenericType(...)

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

READ ALSO
VueJS Element и события

VueJS Element и события

Всем приветИзучаю vuejs

288
Изменение атрибута по клику

Изменение атрибута по клику

Необходимо по клику менять картинкуТ

333
Math.random, Javascript. Что-то пошло не так [дубликат]

Math.random, Javascript. Что-то пошло не так [дубликат]

На данный вопрос уже ответили:

248
Местоположение ссылки на экране

Местоположение ссылки на экране

На веб-странице имеются ссылкиКак получить местоположение ссылки (отступ сверху и слева), пользуясь только инструментом разработчика? А затем...

227