通常在窗口后面有一个 ViewModel,其中包含:
ObservableCollection<IViewModel> AvailableViewModels
IViewModel SelectedViewModel
ICommand SetCurrentViewModelCommand
我显示AvailableViewModels
using a ItemsControl
,它ItemTemplate
设置为 a Button
。Button.Command
绑定到SetCurrentViewModelCommand
,并将AvailableViewModels
集合中的当前数据项通过CommandParameter
为了显示内容区域,我使用了一个ContentControl
with ContentControl.Content
bound to SelectedViewModel
,并且DataTemplates
习惯于告诉 WPF 如何渲染每个 ViewModel。
最终结果是我的 XAML 看起来像这样:
<Window.Resources>
<DataTemplate DataType="{x:Type local:ViewModelA}">
<local:ViewA />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelB}">
<local:ViewB />
</DataTemplate>
</Window.Resources>
<DockPanel>
<Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0">
<ItemsControl ItemsSource="{Binding AvailableViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.SetCurrentViewModelCommand, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
CommandParameter="{Binding }"
Margin="2,5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<ContentControl Content="{Binding SelectedViewModel}" />
</DockPanel>
您可以在我的博客上查看用于此类设置的完整代码示例