Подход, на который вы ссылаетесь, это композиция ViewModel. Это где у вас есть несколько сложных частей представления, которые необходимо привязать к своей собственной сущности ViewModel. Подход влечет за собой создание корневой ViewModel со свойствами для каждого дочернего ViewModel. Затем корневой вид привязывается к корневой модели представления, и каждый вид (независимо от того, отображается ли он или свернут) привязывается к соответствующему свойству в корневой модели представления.
ViewModel будет выглядеть так:
public class RootViewModel
{
ChildViewModelA ChildA { get; set; }
ChildViewModelB ChildB { get; set; }
}
Вид будет выглядеть так:
<Grid>
<ChildViewA DataContext="{Binding ChildA}" />
<ChildViewB DataContext="{Binding ChildB}" />
</Grid>
Вы также можете реализовать это, чтобы позволить себе выбрать активное рабочее пространство.
ViewModel будет выглядеть так:
public class RootViewModel
{
public List<ViewModel> ChildWorkspaces { get; set; }
public ViewModel ActiveWorkspace { get; set; }
public RootViewModel()
{
ChildWorkspaces.Add(ChildViewModelA);
ChildWorkspaces.Add(ChildViewModelB);
}
}
Вид будет выглядеть так:
<Grid>
<Grid.Resources>
<DataTemplate DataType="ChildViewModelA">
<ChildViewA />
</DataTemplate>
<DataTemplate DataType="ChildViewModelB">
<ChildViewB />
</DataTemplate>
</Grid.Resources>
<ContentControl Content="{Binding ActiveWorkspace}" />
</Grid>
Это приведет к тому, что соответствующее визуальное представление будет выбираться на основе типа фактического объекта, хранящегося в ActiveWorkspace.
Простите, мой ответ был в WPF. Я изо всех сил старался не попасться в синтаксис всего этого: -)
Как видите, множественность «ViewModel» может быть неоднозначной. Часто мы сталкиваемся с необходимостью создания нескольких подобъектов, чтобы правильно структурировать ViewModel. Но все сущности ViewModel будут где-то внутри корневого объекта View Model.
При реализации MVVM в WPF я предпочитаю выводить, какой визуальный элемент неявно применять к контексту данных (как показано во второй половине этого ответа). В более сложных сценариях я предпочитаю использовать DataTemplateSelector для принятия такого решения. Но в очень простых случаях вы можете явно применять DataContext либо в C # / ActionScript, либо декларативно через привязки.
Надеюсь, это поможет!