2017-04-12 110 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>检查更新? –