2013-02-26 40 views
1

如果我的主窗口具有下面的代码:改变在MVVM视图

<Window x:Class="DaveMVVM.View.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:viewModel ="clr-namespace:DaveMVVM.ViewModel" 
     xmlns:view="clr-namespace:DaveMVVM.View" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.Resources> 
      <viewModel:MainWindowViewModel x:Key="Vm" /> 
     </Grid.Resources>   
     <view:MyFirstView />   
    </Grid> 
</Window> 

那么我可以假设我不能改变从MyFirstView查看...例如,我会想我的主窗口只是一个实际上仅托管Menu的框架,并且取决于他们从Menu中选择的选项取决于显示的视图。

所以,我的2个问题是

1)我是在想,上面的例子就不会起作用,因为视图是硬编码修正。
2)我是否必须使用绑定到我的MainWindowViewModel的DataTemplates,然后为每个View创建一个DataTemplate?

谢谢。

回答

1

你会做如下:

你MainWindowViewModel公开属性CurrentContent。它返回所有视图模型的通用基本类型:

public ViewModelBase CurrentContent 
{ 
    get { return _currentContent; } 
    private set 
    { 
     if(value == _currentContent) 
      return; 

     _currentContent = value; 
     RaisePropertyChanged("CurrentContent"); 
    } 
} 

根据用户的选择,您可以将该属性设置为相应的视图模型。

你的主要观点将包含绑定到该物业的ContentControl

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

最后,你的观点 - 或单独的资源字典 - 必须包含数据的模板为每个可能的内容检视 - 型号:

<DataTemplate DataType="{x:Type MyFirstViewModel}"> 
    <view:MyFirstView /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type MySecondViewModel}"> 
    <view:MySecondView /> 
</DataTemplate> 
+0

再次感谢你丹尼尔。这正是我所做的,但我担心我做错了! D'哦。再次感谢您的帮助。 – Dave 2013-02-26 14:10:42

+0

@DaveRook:不客气,你不是做错了。这是正确的方法,给你最大的解耦和灵活性。 – 2013-02-26 14:13:07