我有兴趣创建一个显示某些按钮并根据所选按钮更改视口的应用。我的应用中的视口是ContentControl
,我想在每次点击按钮时更改其内容。但是,我相信这是一种更好的方法,可能是将我希望呈现的每个视图的ViewModel注入ContentControl
并使用DataTemplates
设置样式(因为我想避免使用带有许多控件的网格,只要我想显示特定视图,就设置它们的Visibility
属性。哪种方法对你来说似乎更好?你有不同的方法吗?
视图应该与此类似:
谢谢!
答案 0 :(得分:2)
窗口后面通常有一个ViewModel,其中包含:
ObservableCollection<IViewModel> AvailableViewModels
IViewModel SelectedViewModel
ICommand SetCurrentViewModelCommand
我使用AvailableViewModels
显示ItemsControl
,其ItemTemplate
设置为Button
。 Button.Command
绑定到SetCurrentViewModelCommand
,并通过AvailableViewModels
CommandParameter
集合中的当前数据项
要显示内容区域,我使用ContentControl
ContentControl.Content
绑定到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>
您可以查看用于此类设置的完整代码的示例on my blog