Динамические элементы управления в WPF MVVM

У меня есть приложение с MVVM, которое отлично работает. Теперь я хочу заменить один из моих элементов управления динамическим элементом управления. Под динамическим я подразумеваю, что я понятия не имею, что это за элемент управления, только то, что это элемент управления с графическим интерфейсом. Это может быть что-то такое же простое, как изображение, или пользовательский элемент управления третьей стороны, который будет создан кем-то другим после того, как это приложение будет готово.

Может ли кто-нибудь пролить свет на то, как этого можно добиться в MVVM? Я сделал это давным-давно, используя ListBox или аналогичный (iirc) для создания элементов графического интерфейса (не помню подробностей). Но на этот раз я хотел бы изучить теорию, стоящую за этим.

Изменить:
Допустим, представление содержит список экземпляров, например, System.Windows.UIElement. Я хочу отобразить все эти элементы управления пользовательского интерфейса на поверхности (например, в многоуровневом элементе управления).


person Tedd Hansen    schedule 27.03.2011    source источник


Ответы (1)


Вы можете создать представление, которое предоставляет свойство содержимого в качестве заполнителя (поэтому ContentControl может быть всем, что необходимо). Затем свойство содержимого может быть установлено для динамического элемента управления.

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

Динамически загружаемый элемент управления должен будет обращаться к данным с помощью свойства DataContext. Если динамический элемент управления также является MVVM, у него может быть своя собственная ViewModel, поэтому вам придется найти способ загрузить ее (снова отражение?) и указать DataContext элемента управления на загруженную ViewModel.

Имеет ли это смысл, это то, что вы ищете?

person Emond Erno    schedule 27.03.2011
comment
Я уже занимаюсь отражением, чтобы динамически загружать *.dll и создавать экземпляры любого элемента управления, который выбирает пользователь. Моя мысль заключалась в том, чтобы поместить элемент управления (как модель) в представление, чтобы через DataContext он отображался. (и я тоже должен добавить: если это имеет смысл ;)) Так, например, ColorImage привязан к данным как ‹Image Source={Binding Path=ColorImage.BitmapSource}/›, а OutputImage содержит экземпляр, например, System.Windows.UIElement что я хочу отображать. Это экземпляр, который мне нужен для привязки к графическому интерфейсу. - person Tedd Hansen; 27.03.2011
comment
Поясню прямо: вы считаете динамически загружаемый элемент управления Моделью? - person Emond Erno; 27.03.2011
comment
Да, потому что он существует в структуре данных, предоставляемой представлением. Но плевать на семантику. :) - person Tedd Hansen; 28.03.2011
comment
Так в чем твой вопрос? Вы уже определились, что такое View и что такое Model. Остается только ViewModel. Виртуальная машина будет содержать логику отражения и будет предоставлять результаты. - person Emond Erno; 28.03.2011