0

我有兴趣创建一个显示一些按钮并根据所选按钮更改视口的应用程序。我的应用程序中的视口是 a ContentControl,我想在单击按钮时更改其内容。但是,我相信有一个更好的方法,也许通过注入我想要呈现给的每个视图的 ViewModelContentControl并使用它们来设置样式DataTemplates(因为我想避免有一个包含许多控件的网格,并且只Visibility在我想的时候设置它们的属性显示特定视图)。哪种方法对您来说更好?您对此有不同的方法吗?

视图应该与此类似: 通用应用程序UI设计

谢谢!

4

1 回答 1

2

通常在窗口后面有一个 ViewModel,其中包含:

  • ObservableCollection<IViewModel> AvailableViewModels
  • IViewModel SelectedViewModel
  • ICommand SetCurrentViewModelCommand

我显示AvailableViewModelsusing a ItemsControl,它ItemTemplate设置为 a ButtonButton.Command绑定到SetCurrentViewModelCommand,并将AvailableViewModels集合中的当前数据项通过CommandParameter

为了显示内容区域,我使用了一个ContentControlwith ContentControl.Contentbound 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>

您可以在我的博客上查看用于此类设置的完整代码示例

于 2013-01-30T14:03:57.643 回答