3

我是使用 WPF 的新手,在使用 MVVM Light Toolkit 的 WPF 应用程序中跨多个屏幕导航时,我想看看人们推荐的最佳实践。作为 WPF 的新手,如果我的术语不正确,请原谅我,因为我不确定正确的术语是“切换视图”、“导航页面”、“更改窗口”还是其他内容(澄清这些术语与WPF 将不胜感激)。

为了澄清我想要做什么:我有一个应用程序,它有 3 个全屏页面/视图,用户应该能够来回移动。这些视图永远不会同时显示,因此它们最容易与选项卡控件中的选项卡进行比较;除了我不想要标签控件通常附带的标签条。相反,我想以编程方式在页面/视图之间切换。

在以下堆栈溢出答案中,我已经看到了几种不同的方法:

  1. https://stackoverflow.com/a/6114865/1081879
  2. 如何使用 MVVM Light for WPF 在窗口中导航?

所以真的我只是想知道上述哪种方法是我应该前进的方向?我实际上已经实现了第一个答案,但我不确定这样做是否是对数据模板的“滥用”/“hack”,或者这是否是应该使用框架的方式。

最后,如果其他工具包开箱即用地提供此功能,那么 MVVM Light 可能不是我可以使用的最合适的工具包。任何人都可以阐明这个概念,也许会推荐一个更合适的工具包?

谢谢,

4

2 回答 2

1

一个快速而肮脏的导航示例(这是在这里而不是在 VS 中编写的,因此如果拼写错误,请应用修复):

让我们为我们的视图创建一个分层描述:

  public abstract Class ViewModelBase : INotifyPropertyChanged{} 
  public abstract Class ViewModelNavigationBase : ViewModelBase {} 
  public Class ViewModel1 : ViewModelNavigationBase {}
  public Class ViewModel2 : ViewModelNavigationBase {}
  public Class ViewModel3 : ViewModelNavigationBase {}

  public Class MainViewModel : ViewModelBase 
  {
      private ViewModelNavigationBase  currentViewModel; 
      public ViewModelNavigationBase  CurrentViewModel 
      {
         get{return currentViewModel;}
         set
         {
            currentViewModel = value;
            OnPropertyChanged("CurrentViewModel");                
         }
      }          

      private const int numberOfPages = 3 ;
      private int index;
      private ViewModelNavigationBase[numberOfPages] pages;
      ....
      ... OnNavigateCommand()
      {
          index++;
          index = index % numberOfPages;
          CurrentViewModel = pages[index];
      }

 }

资源 :

     <local:MainViewModel x:Key="MainVm" /> 

     <DataTemplate TargetType={x:Type local:ViewModel1}>
         <local:View1 />
     </DataTemplate>

     <DataTemplate TargetType={x:Type local:ViewModel2}>
         <local:View2 />
     </DataTemplate>

     <DataTemplate TargetType={x:Type local:ViewModel3}>
         <local:View3 />
     </DataTemplate>

xml:

 <Window x:Name="MainWindow" 
         DataContext={StaticResource MainVm}>
       <StackPanel>
           <ContentControl Content={Binding CurrentViewModel} />
           <Button Content="Navigate" Command="{Binding NavigateCommand}"/>
       </StackPanel>       
 </Window>     
于 2012-10-12T20:45:48.343 回答
1

我在这个问题中真正寻找的是一个参考,它显示了我列出的两种方法中的一种实际上是常用的并且是一种可靠的方法。

我终于偶然发现了这个:http: //msdn.microsoft.com/en-us/library/gg405484%28v=PandP.40%29.aspx

这为您的视图模型调用了第一种使用数据模板的方法。

于 2012-10-19T20:57:01.520 回答