2016-02-05 97 views
2

首先,我为我的可怜英语表示歉意,这不是我的第一语言。使用MVVM LIGHT(WPF)导航UserControl

我在MVVM新的,所以我的问题可能是一个很菜鸟一个;)

我遇到了一些问题,在使用WPF和MVVM光C#应用程序切换视图。我读了很多文章,但我仍然无法弄清楚如何以一种干净的方式做到这一点。

因此,这里是我的问题:什么是实现包含在用户控件MainWindows之间的导航的最佳方式,假设:

  • 我有一个视图模型为每个用户控件,一个是主窗口。
  • 为用户控件之间进行切换的按钮都包含到用户控件本身
  • 我有一个ViewModelLocator
  • 我需要有时销毁/重新创建一个用户控件的视图模型
  • 我要尊重MVVM模式。
  • 我要保持它的简单
+0

看看这个:https://rachel53461.wordpress.com/2011/07/17/navigation-with-mvvm/ – Jose

+0

我已经阅读过这篇文章,但它不是在谈论MVVM Light,也没有ViewModelLocator。这不是我要找的。但谢谢你试图帮助我:) – Speuline

回答

4

因为没有人回答我的问题,这是我终于做到了。 它可能不是最好的方式,但至少它运作良好。 我希望它会帮助一些新手和我一样谁正在努力学习这种模式:

把一个CurrentViewModel对象在MainViewModel:

public class MainViewModel : ViewModelBase,IMainViewModel 
{ 
    /* Other piece of code */ 

    private ViewModelBase _currentViewModel; 

    public ViewModelBase CurrentViewModel 
    { 
     get 
     { 
      return _currentViewModel; 
     } 
     set 
     { 
      _currentViewModel = value; 
      RaisePropertyChanged(() => CurrentViewModel); 
     } 
    } 
} 

显然这个绑定到MAINVIEW(只是有关代码):

<UserControl Content="{Binding Path=CurrentViewModel}"/> 

把DataTemplate中的应用。XAML:

<Application.Resources> 
     <ResourceDictionary> 
      <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
      <DataTemplate DataType="{x:Type localViewModel:HomeViewModel }"> 
       <localView:AccueilView/> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type localViewModel:ErrorViewModel }"> 
       <localView:ErrorView/> 
      </DataTemplate> 
     </ResourceDictionary> 
    </Application.Resources> 

用简单的国际奥委会注册视图模型在ViewModelLocator:

if (ViewModelBase.IsInDesignModeStatic) 
{ 
    SimpleIoc.Default.Register<IHomeViewModel, DesignHomeViewModel>(); 
} 
else 
{ 
    SimpleIoc.Default.Register<IHomeViewModel, HomeViewModel>(); 
} 

将所有视图模型的吸气剂的ViewModelLocator为静态(只是一个用于为例)

public static IHomeViewModel Home 
{ 
    get{return ServiceLocator.Current.GetInstance<IHomeViewModel>();} 
} 

由于它'的静态您可以访问视图模型,你从MainViewModel想:

public class MainViewModel : ViewModelBase,IMainViewModel 
{ 
     public ViewModelBase HomeVM 
     { 
      get 
      { 
       return (ViewModelBase)ViewModelLocator.Home; 
      } 
     } 
} 

提供注销视图模型的能力,并重建它:

public static void CleanUpHome() 
{ 
    SimpleIoc.Default.Unregister<HomeViewModel>(); 
    SimpleIoc.Default.Register<IHomeViewModel, HomeViewModel>(); 
} 

“儿童”视图模型与通信MainViewModel消息:

public class ErrorViewModel : ViewModelBase, IErrorViewModel 
{  
    /*Other piece of code */ 

     public void HomeReturn() 
     { 
      var msg = new ChangeView(ChangeView.EnumView.Home); 
      Messenger.Default.Send<ChangeView>(msg); 
      ViewModelLocator.CleanUpErrors(); 
     } 
} 

的MainViewModel注册的消息,并对其进行处理:

public class MainViewModel : ViewModelBase,IMainViewModel 
{ 
    public MainViewModel() 
    { 
     Messenger.Default.Register<ChangeView>(this, (action) => ReceiveMessage(action)); 
     CurrentViewModel = HomeVM; 
    } 

    private void ReceiveMessage(ChangeView viewName) 
    { 
     switch (viewName.switchView) 
     { 
      case ChangeView.EnumView.Home: 
       CurrentViewModel = HomeVM; 
       break; 
      case ChangeView.EnumView.Error: 
       CurrentViewModel = ErrorVM; 
       break; 
      } 
     Messenger.Default.Unregister<ChangeView>(this, (action) => ReceiveMessage(action)); 
    } 

这就是全部。