Имеется (c# wpf) окно, в котором динамически показываются разные контролы (фреймы). Набор показываемых контролов определяется в главной vm. Каждый контрол отвечает за работу с отдельным API. В окне может быть несколько контролов одного типа. Данные между разными контролами (в т.ч. одного типа) не пересекаются. Главное окно (vm) отвечают только за состояние (show/hide) контролов.
Между собой контролы по данным не пересекаются. Набор и количество контролов фиксированы. Динамического создания и размещения не происходит.
Вопрос где размещать vm данные для контролов.
Вариант 1: Все в одной vm. Тогда как описать массив контролов одного вида?
Вариант 2: Для каждого контрола своя полноценная vm. С INotifyPropertyChanged, установкой DataContext и т.д.
Вариант 3: Для контрола создается класс vm (напр Type1ViewModel), а в главной vm что-то типа Type1ViewModel[]
И как следствие вопрос, как в разметке (ну или в главной vm) назначать DataContext?
Я бы сделал так: для каждого из контролов — своя полноценная VM. В конце-концов, у них разные методы работы, так что вам нужны разные типы. Если вам нужно поместить их в общий контейнер, пускай они реализуют общий интерфейс.
DataContext правильно назначать так. Главная VM создаётся не в разметке, а внешним кодом. Лучше всего для этого подходит App.xaml.cs. Там вы создаёте главную VM, главное окно, и устанавливаете ему DataContext. Смысл этого в том, что вы не всегда можете правильно отконфигурировать главную VM конструктором без параметров.
Вложенные VM для контролов должны быть доступны через главную VM как свойства (или как свойство-коллекция, например).
Раздачу вложенных VM контролам переложите на MainWindow. У вас должен быть код наподобие
<MyApiControl DataContext="{Binding MyApiVM}"/>
в главном окне.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости