2017-04-12 111 views
0

我想實現我的xamarin移動項目MVVM模式。使用MVVM模式,而無需使用現有的MVVM頁面導航構架

我有以下文件MVVM

  1. LoginView
  2. LoginViewModel
  3. BaseViewModel

以下是我LoginViewModel

public class LoginViewModel : BaseViewModel 
    { 

     private bool isLoginIndicator= false; 
     private string etUserName; 
     private string etPassword; 
     public LoginViewModel() 
     { 

      OnLogin = new Command(doLogin ,()=>!LoginIndicator); 


      MessagingCenter.Subscribe<IMessage, EventType>(this, RestApi.UI_EVENT, (sender, eventType) => 
      { 
       LoginIndicator = false; 
       if (eventType.status) 
       { 
        Application.Current.MainPage.DisplayAlert(AppResources.success, "Login done", "Ok"); 

       } 
       else 
       { 
        Application.Current.MainPage.DisplayAlert(AppResources.failed, eventType.errorMessage, "Ok"); 


       } 

      }); 


     } 


     public bool LoginIndicator 
     { 
      get { return isLoginIndicator; } 
      set 
      { 
       isLoginIndicator = value; 
       OnPropertyChanged("LoginIndicator"); 
       OnLogin.ChangeCanExecute(); 

      } 
     } 
     public string UserName 
     { 
      get { return etUserName; } 
      set 
      { 
       etUserName = value; 
       OnPropertyChanged("UserName"); 
      } 
     } 

     public string Password 
     { 
      get { return etPassword; } 
      set 
      { 
       etPassword = value; 
       OnPropertyChanged("Password"); 
      } 
     } 

     public Command OnLogin { get; } 

     void doLogin() 
     { 
      LoginIndicator = true; 

      UserRequest user = new UserRequest(); 
      user.userName = etUserName; 
      user.password = etPassword; 
      user.companyId = "CEE"; 
      user.appVersion = Constants.getAppVersion(); 
      user.osVersion = Constants.getOSVersion(); 
      user.deviceId = Constants.getDeviceModel() + " " + Constants.getDevicePlatform(); 


      new RestApi().userLogin(JsonConvert.SerializeObject(user)); 


     } 
    } 

該類通常使得Web服務調用時OnLogin命令從按鈕激發和Message使用MessageCenter

現在我想轉到我的MainPage這是母版頁一旦用戶成功,因此我需要導航到母版頁時eventType.status是真實的記錄播出內Message Subscriber

,但我不知道我怎樣才能正確地根據MVVM模式切換不同頁面。

我試圖在網上搜索,我發現有可用像MVVMCrossMVVMLight等現成的框架,但我不希望使用那些依賴條件,並願意執行導航一些其他的方式,如果任何人都可以提出

+0

Application.Current.MainPage =新MyFirstPageAfterLogin();它不正確? –

+0

它會是一個適當的方式來做到這一點在MVVM模式?不知道雖然:) – Hunt

+0

我不知道...我認爲你應該從ViewModel發送一個消息中心視圖和視圖使用Application.Current.MainPage =新...但我不知道。我不知道MVVM非常好... –

回答

4

MVVM對導航沒有提及,所以基本上每個選項都可以。

對代碼的唯一的事情,如:

Application.Current.MainPage = new MyFirstPageAfterLogin();

是你現在從您的視圖模型,在頁面的引用,你想要什麼這不應該。這就是爲什麼MVVM框架往往採用了一項名爲視圖模型到ViewModelnavigation概念。有了這個,你可以指定一個你想要導航的ViewModel。根據框架(或他們如何實現它),他們有您先註冊一個耦合或使用的命名慣例。例如;我喜歡使用FreshMvvm,這是通過命名約定來完成的。

所以,當我想導航到PageAfterLoginPage,我創建了一個PageAfterLoginPageModel。從我的視圖模型(或PageModel在Xamarin命名),我現在就可以導航到該PageModel,而不是使硬參考頁。這樣,Page和PageModel是分開的,如果我願意,我可以很容易地將視圖換出。

因此,無論是使用現有的框架,或者窺視到他們的GitHub庫,看看他們是怎麼做的,如果你堅持做自己。

+0

那裏的邏輯理解起來相當複雜,甚至沒有與之相關的文檔 – Hunt

+0

這不是火箭科學。 [這是](https://github.com/rid00z/FreshMvvm/blob/master/src/FreshMvvm/PageModelCoreMethods.cs#L46)其中一個PageModel被推送。只需按照從那裏調用的方法,你應該看到你需要的所有代碼。那麼更具體的是什麼呢?我想我已經給了你一個很好的主意,說明事情是怎樣的,以及你可以從這裏走到哪裏。 –

+0

雅我知道這不是火箭科學,但這裏的問題是新的xamarin和C# – Hunt

0

隨着最新的工具做一個文件/新建工程/跨平臺/主詳細。 master-detail模板都是MVVM,不使用任何第三方框架。有本地和形式permutatations。非常適合學習和探索。

希利在坦帕。

enter image description here

+0

我沒有看到我的視覺工作室2015年這個選項,我可以知道我怎麼能得到該模板? – Hunt

+0

你的Xamarin是最新的?工具> Xamarin>檢查更新? –