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

C# 根据WPF中的选定选项更改内容,c#,.net,wpf,viewmodel,contentpresenter,C#,.net,Wpf,Viewmodel,Contentpresenter,我感兴趣的是创建一个应用程序,它可以显示一些按钮,并根据所选按钮更改视口。我的应用程序中的视口是一个ContentControl,每当单击一个按钮时,我都想更改它的内容。但是,我相信有一种更好的方法,可能是将我想要呈现的每个视图的viewmodel注入ContentControl,并使用DataTemplates(因为我不想让一个网格有很多控件,只要我想显示一个特定的视图,我就只需要设置它们的可见性属性)。你觉得哪种方法更好?你有不同的方法吗 视图应类似于以下内容: 谢谢!通常在窗口后面有一个

我感兴趣的是创建一个应用程序,它可以显示一些按钮,并根据所选按钮更改视口。我的应用程序中的视口是一个
ContentControl
,每当单击一个按钮时,我都想更改它的内容。但是,我相信有一种更好的方法,可能是将我想要呈现的每个视图的viewmodel注入
ContentControl
,并使用
DataTemplates
(因为我不想让一个网格有很多控件,只要我想显示一个特定的视图,我就只需要设置它们的
可见性
属性)。你觉得哪种方法更好?你有不同的方法吗

视图应类似于以下内容:


谢谢!

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

  • observeCollection可用的视图模型
  • IViewModel SelectedViewModel
  • ICommand SetCurrentViewModelCommand
我使用
ItemsControl
显示
AvailableViewModels
,该控件将
itemstemplate
设置为
按钮
按钮.命令
绑定到
SetCurrentViewModelCommand
,并通过
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>


您可以查看用于此类设置的完整代码示例

您目前如何更改内容?“我的问题是-您知道另一种更好的方法吗?”-要回答此问题,我们需要查看您的代码)我通常有一个ViewModel对象的
ObservableCollection
,我使用
ItemsControl
显示该对象,该控件有一个
按钮,用于
ItemTemplate
,并将
ContentControl.Content
绑定到
SelectedItem
。您可以看到这样一个代码示例,我还没有开始编写它。这只是我想到的第一种方法。在编写代码之前,我想确定我的方向是正确的。@JonathanPerry:从WPF的角度来看,使用PRISM(MVVM模式)框架可以更好地实现您的功能。在这里,您可以创建一个shell(基本或主屏幕),将其划分为多个区域,创建视图,使它们相互作用,基于在一个视图中的选择,您可以更改UI(基本上在区域中加载相关视图)。这正是我想要的。谢谢瑞秋@JonathanPerry抱歉,
RelayCommand
是一个自定义类,而不是MVVM Light使用的类。它的代码发布在(我试图不让第三方库出现在我的示例中)谢谢,在MVVM light上也找到了它(它有一个
RelayCommand
RelayCommand
类,可以与您的示例一起使用)。