2011-09-02 241 views
0

我是WPF的新手,我使用WPF Model-View-ViewModel Toolkit 0.1来掌握WPF。从MainView导航到另一个视图

我有一个相当简单的问题,但我无法得到我的头。

如何显示mainview上菜单项的新视图?

这是我的代码看起来像:

MainView.xaml

<Menu DockPanel.Dock="Top"> 
    <MenuItem Header="_File"> 
     <MenuItem Command="{Binding NewPage}" Header="New Page" 
            InputGestureText="Ctrl-N" /> 
    </MenuItem> 
</Menu> 

MainViewModel.cs

private DelegateCommand newPageCommand; 

    public ICommand NewPage 
    { 

     get 
     { 

      if (newPageCommand == null) 
      { 
       newPageCommand = new DelegateCommand(GoToNewPage); 
      } 
      return newPageCommand; 
     } 
    } 


    private void GoToNewPage() 
    { 
     ??? 
    } 

做我的GoToNewPage写什么来显示newPage.xaml?

+0

什么是页,一个对话框,窗口或像一个TabItem的东西吗? – thumbmunkeys

+0

它是一个新的wpfPage。 newpage.xaml – Asdfg

回答

1

通常,您的应用程序完全在ViewModels中运行,View用于允许用户以友好的方式与ViewModel进行交互。

就你而言,ViewModel可能有一个名为CurrentPage的属性,该属性在你的视图中绑定到ContentControl.Content。要更改页面,GoToNewPage命令会将CurrentPage属性设置为NewPageViewModel

这将导致ContentControl实现它结合了变化,在更新绑定的过程中,它会意识到Content已发生变化,它需要使用一个新的DataTemplate得出这样的内容。

<ContentControl Content="{Binding CurrentPage}"> 
    <ContentControl.Resources> 
     <DataTemplate DataType="{x:Type local:HomePageViewModel}"> 
      <local:HomePageView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:NewPageViewModel}"> 
      <local:NewPageView /> 
     </DataTemplate> 
    </ContentControl.Resources> 
</ContentControl> 

我有这个here的一个简单的例子,如果你有兴趣

+0

它说'本地'是一个未声明的命名空间。任何想法我在这里失踪? – Asdfg

+0

@asdfg您需要在代码顶部定义'local'命名空间。显示的示例代码假设'Views'和'ViewModels'在同一个命名空间中,并且该命名空间通过'xmlns:local =“clr-namespace:MyNamespace”映射到'local'' – Rachel

+0

其中一个,使用Resharper的很多原因是,如果您在不提供其(XML)名称空间的情况下在XAML中引用某个类型,它将为您提供一个名称空间,甚至可以创建一个新的名称空间声明和前缀(如果需要的话)。 –

相关问题