2016-02-05 152 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)); 
    } 

這就是全部。