您指的方法是 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 对象中的某个位置。
在 WPF 中实现 MVVM 时,我更喜欢推断隐式应用数据上下文的可视元素(如本响应的后半部分所示)。在更复杂的场景中,我更喜欢使用 DataTemplateSelector 来进行决策。但在超级简单的情况下,您可以在 C#/ActionScript 中以命令方式或通过绑定以声明方式显式应用 DataContext。
希望这可以帮助!