2011-07-07 78 views
4

我一直在学习与Josh Smith's article MVVM模式,我想创建一个经典的布局与一些链接到右侧(用命令管理),所以当我点击一个我可以显示我的视图向右移动到一个选项卡控件(在它内部有一个ContentControl)。动态绑定视图到ContainerControl与MVVM

当我使用具有特定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> 

但是,我想要更通用的东西。我的意思是我的mainWindow不应该知道一个特定的视图或特定的ViewModel。它应该只知道它绑定了一些命令并且具有显示“某些视图”的选项卡控件。包括Josh Smith's article在内的每个示例似乎都具有有限的视图范围和视图模型,这对于示例非常有用。因此,我怎么能告诉我的ContentControl某些视图(及其相应的viewModel)会在那里,而不是如此具体(没有“烧”到mainView的具体类型)?

问候 罗德里戈

PD。我已经尝试与基地一个ViewModel和基本视图,但它似乎并没有工作。

回答

3

在你的主视图,绑定ContentControl到一个通用的ViewModelBase财产

<ContentControl Content="{Binding CurrentPage}" /> 

CurrentPage将在主视图模型为ViewModelBase对象定义,并进行切换,你只需设置CurrentPage到任何你想要的页面。

所以,当你点击一些像HomePageCommand,主视图模型将执行CurrentPage = new HomePageViewModel();ViewModelBase提供HomePageViewModel继承。

我写的东西一会儿前,显示一些样品here如果你

+0

雷切尔您好,感谢您的建议有兴趣(顺便说一下,你能纠正你的链接?)。我已经尝试过,但我无法弄清楚如何将HomePageViewModel与其相应的HomePageView关联起来? –

+0

@Rodrigo你在问题中正确地做了。在您的应用程序资源中,定义将每个ViewModel映射到指定View的数据模板。通常我把映射放在App.xaml的''下面。另一种方法是将DataTemplates放入ResourceDictionary中,并在运行时将ResourceDictionaries加载到应用程序的MergedDictionaries中。如果ResourceDictionaries是动态加载的,或者如果它们存在于其他dll中,则使用此方法。 (我也修正了链接) – Rachel

+0

我对[你的例子](http://rachel53461.wordpress.com/2011/05/28/switching-between-viewsusercontrols-using-mvvm/)有个疑问。是否有涉及视图?我的意思是,如果我有300个视图,我是否应该在mainView上显式标记该标记? –