ViewModel - одна или несколько вложенных

225
21 декабря 2017, 23:12

Имеется (c# wpf) окно, в котором динамически показываются разные контролы (фреймы). Набор показываемых контролов определяется в главной vm. Каждый контрол отвечает за работу с отдельным API. В окне может быть несколько контролов одного типа. Данные между разными контролами (в т.ч. одного типа) не пересекаются. Главное окно (vm) отвечают только за состояние (show/hide) контролов.

Между собой контролы по данным не пересекаются. Набор и количество контролов фиксированы. Динамического создания и размещения не происходит.

Вопрос где размещать vm данные для контролов.

Вариант 1: Все в одной vm. Тогда как описать массив контролов одного вида?

Вариант 2: Для каждого контрола своя полноценная vm. С INotifyPropertyChanged, установкой DataContext и т.д.

Вариант 3: Для контрола создается класс vm (напр Type1ViewModel), а в главной vm что-то типа Type1ViewModel[]

И как следствие вопрос, как в разметке (ну или в главной vm) назначать DataContext?

Answer 1

Я бы сделал так: для каждого из контролов — своя полноценная VM. В конце-концов, у них разные методы работы, так что вам нужны разные типы. Если вам нужно поместить их в общий контейнер, пускай они реализуют общий интерфейс.

DataContext правильно назначать так. Главная VM создаётся не в разметке, а внешним кодом. Лучше всего для этого подходит App.xaml.cs. Там вы создаёте главную VM, главное окно, и устанавливаете ему DataContext. Смысл этого в том, что вы не всегда можете правильно отконфигурировать главную VM конструктором без параметров.

Вложенные VM для контролов должны быть доступны через главную VM как свойства (или как свойство-коллекция, например).

Раздачу вложенных VM контролам переложите на MainWindow. У вас должен быть код наподобие

<MyApiControl DataContext="{Binding MyApiVM}"/>

в главном окне.

READ ALSO
Построение Master/Slave системы сервисов на базе WCF

Построение Master/Slave системы сервисов на базе WCF

Я понимаю общие принципы Master/Slave, но как это красиво наложить на WCF очень туманно вижу

201
Переопределение функций свойств get/set

Переопределение функций свойств get/set

Задача: слияние узлов XML и классов, где свойства помеченные атрибутом ToXmlAttribute, являются атрибутами Xml (Node Name=""):

432
Почему если в исходном массиве, если последний элемент == 1 не добавляет в новую коллекцию?

Почему если в исходном массиве, если последний элемент == 1 не добавляет в новую коллекцию?

Есть массив из нулей и единиц, мне нужно за один проход по массиву найти сумму единиц до каждого из нулей и результат записать в новую коллекцию,...

205
Не получается создать новую базу данных SQL Server

Не получается создать новую базу данных SQL Server

Читаю сейчас книгу Троелсена и при создании новой базы данных SQL Server возникла ошибка:

172