Передача больших массивов данных в пользовательские элементы управления - PullRequest
2 голосов
/ 29 декабря 2010

Поскольку UserControls в WPF должны иметь конструкторы без параметров, что является правильным способом предоставления им довольно сложных данных, которые необходимы «почти» во время построения. Я пытался использовать свойства зависимостей для этого, но сталкиваюсь с проблемами с дизайнером Visual Studio, препятствующими попыткам передать что-то вроде Dictionary<string,MyObject> в типизированное свойство зависимости IDictionary<string,MyObject>. В какой-то момент ему нужно точное совпадение типов времени компиляции, иначе XAML не появится в конструкторе, хотя приложение выполняется просто отлично.

По сути, я хочу, чтобы хороший способ передавать вещи, которые я обычно передаю в конструктор, в пользовательский элемент управления. Какой лучший способ?

Обновление: Рассматриваемый пользовательский элемент управления всегда будет создаваться из XAML, поэтому использование конструкции без параметров в дополнение к структуре без параметров не является вариантом.

Обновление 2: Интересной идеей было бы иметь что-то доступное из конструктора без параметров, из которого я могу получить свои данные инициализации. Что-то вроде, возможно, вопроса: кто из моих уже инициализированных предков реализует интерфейс IMyDataProvider? Это может быть похоже на то, как работает привязка источника к типу предка , за исключением того, что выполняется программно из конструктора пользовательского элемента управления.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

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

public class InitializationData
{
    public IDictionary<TKey, TValue> Dictionary { get; set; }
}

Этот уровень косвенности преодолеет ограничения дизайнера Visual Studio.

1 голос
/ 29 декабря 2010

Пара вариантов.

1, у вас может быть несколько конструкторов, один без параметров, когда ваш элемент управления создается с помощью XAML, и другой, который принимает набор параметров, когда вы создаете его непосредственно с помощью кода. Если вы определенно не хотите создавать свой экземпляр с помощью кода, тогда ...

2, добавить открытое свойство, которое имеет только установщик и определено с точным типом словаря, который вы хотите передать и использовать в качестве данных для инициализации элемента управления. Свойство необходимо вызвать только один раз. У вас могут быть другие свойства, которые являются геттерами / сеттерами, которые предоставляют эти инициализированные данные в порядке более общих типов.

...