根据WPF中的选定选项更改内容

时间:2013-01-30 13:35:12

标签: c# .net wpf viewmodel contentpresenter

我有兴趣创建一个显示某些按钮并根据所选按钮更改视口的应用。我的应用中的视口是ContentControl,我想在每次点击按钮时更改其内容。但是,我相信这是一种更好的方法,可能是将我希望呈现的每个视图的ViewModel注入ContentControl并使用DataTemplates设置样式(因为我想避免使用带有许多控件的网格,只要我想显示特定视图,就设置它们的Visibility属性。哪种方法对你来说似乎更好?你有不同的方法吗?

视图应该与此类似: General application UI design

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

我使用AvailableViewModels显示ItemsControl,其ItemTemplate设置为ButtonButton.Command绑定到SetCurrentViewModelCommand,并通过AvailableViewModels

传递CommandParameter集合中的当前数据项

要显示内容区域,我使用ContentControl ContentControl.Content绑定到SelectedViewModelDataTemplates习惯告诉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