使用MVVM动态将视图绑定到ContainerControl中

5
我一直在学习 MVVM 模式,参考了 Josh Smith 的文章,现在我想创建一个经典布局,并在右侧添加一些链接(通过命令管理),这样当我点击其中一个链接时,就可以在选项卡控件中显示我的视图(其中包含 ContentControl)。如果我使用特定的 View 和 ViewModel 的 DataTemplate 来显示屏幕上要显示的内容,那么这很简单。
<!-- this section into my MainWindow's resources file -->
<DataTemplate xmlns:vm='clr-namespace:WpfFramework.ViewModels'
              xmlns:vw='clr-namespace:WpfFramework.Views'
              DataType="{x:Type vm:MySpecificViewModel }" >        
    <vw:MySpecificView />
</DataTemplate>

但是,我希望有更通用的方案。我的主窗口不应该知道特定的视图或特定的视图模型。它只需要知道绑定到某些命令并具有选项卡控件,显示“某个视图”。每个示例,包括Josh Smith的文章,似乎都有限制的视图和视图模型宇宙,这对于样本来说非常好。
那么,如何告诉我的ContentControl,会有一些视图(及其相应的viewModel)出现,而不是那么具体(没有将具体类型“烧”到mainView中)?
此致 Rodrigo
附:我已经尝试过基础ViewModel和Base View,但似乎不起作用。
1个回答

3
在你的主视图中,将一个ContentControl绑定到一个通用的ViewModelBase属性。
<ContentControl Content="{Binding CurrentPage}" />
CurrentPage 将在主视图模型中定义为一个 ViewModelBase 对象,要切换页面,您只需将 CurrentPage 设置为您想要的任何内容。

因此,当您点击像 HomePageCommand 这样的东西时,主视图模型将执行 CurrentPage = new HomePageViewModel();,前提是 HomePageViewModel 继承自 ViewModelBase

如果您有兴趣,我之前写了一些示例内容,可以在这里看到。


@Rodrigo,你在问题中做得很正确。在你的应用资源中,定义将每个ViewModel映射到指定View的数据模板。通常我将这些映射放在App.xaml下的<Application.Resources>中。另一种选择是将DataTemplates放入ResourceDictionary中,并在运行时将ResourceDictionaries加载到应用程序的MergedDictionaries中。如果ResourceDictionaries是动态加载或存在于其他dll中,则我使用此方法。(我还修复了链接) - Rachel
我有一个关于你的示例的问题。是否涉及视图?我的意思是,如果我有300个视图,我应该在我的mainView上显式标记吗? - Rodrigo Caballero
真的吗!!?那么,我的公司项目中将有300个数据模板。好的,我正在消化这个信息... - Rodrigo Caballero
@Rodrigo 如果你有300个ViewModel和300个UserControl用于你的视图,那么你需要300个DataTemplates将它们映射在一起。但是不要忘记,View不一定要是UserControl - 它也可以只是DataTemplate。通常,如果ViewModel很小,我会在需要的地方将View编写为DataTemplate。例如,以具有地址、电话和电子邮件的客户对象为例。我会为我的客户对象创建一个UserControl View,但在UserControl.Resources中,我会将Address/Phone/Email Views定义为DataTemplates。 - Rachel
感谢@Rachel,我有点震惊。我来自ASP.NET MVC和WindowsForms环境,我认为View-ViewModel链接不需要那么多代码会更直接。我仍然在思考Josh Smith的文章评论:“在更复杂的情况下,可以通过编程方式选择视图”。最好的问候 - Rodrigo Caballero
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接