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
类,可以与您的示例一起使用)。