使用MVVM模式进行页面导航而不使用现有的MVVM框架

时间:2017-04-12 10:49:11

标签: xamarin mvvm xamarin.forms

我正在尝试在我的xamarin移动项目中实现MVVM模式。

我有以下MVVM文件

  1. LoginView
  2. LoginViewModel
  3. BaseViewModel
  4. 以下是我的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));
    
    
            }
        }
    

    此类通常在从Button发出OnLogin命令时进行Web服务调用,并使用Message

    广播MessageCenter

    现在我想在用户成功登录后导航到我的MainPage主页面,因此我需要在eventType.status <{1}}内Message Subscriber为真时导航到母版页/ p>

    但我不知道如何根据MVVM模式正确导航到其他页面。

    我试图在网上搜索,我发现有现成的框架,如MVVMCrossMVVMLight等。但我不想使用这些依赖,并愿意以其他方式实现导航任何人都可以建议

2 个答案:

答案 0 :(得分:4)

MVVM对导航一无所知,所以基本上每个选项都没问题。

唯一反对代码的东西:

Application.Current.MainPage = new MyFirstPageAfterLogin();

您现在是否有来自ViewModel的页面的引用,这应该不是您想要的。这就是为什么MVVM框架倾向于实现一个名为ViewModel-to-ViewModelnavigation的概念。这样,您可以指定要导航到的ViewModel。根据框架(或它们如何实现它),它们首先注册耦合或使用命名约定。例如;我喜欢使用FreshMvvm,它通过命名约定来实现。

因此,当我想导航到PageAfterLoginPage时,我会创建一个PageAfterLoginPageModel。从我的ViewModel(或Xamarin命名中的PageModel),我现在可以导航到PageModel,而不是对页面进行硬引用。通过这种方式,Page和PageModel是分开的,如果我愿意,我可以轻松地交换View。

所以,要么使用已经存在的框架,要么查看他们的Github回购,看看他们如何坚持自己做这件事。

答案 1 :(得分:0)

使用最新工具执行文件/新项目/ CrossPlatform / Master-Detail。主 - 详细信息模板都是MVVM,不使用任何第三方框架。有本地和形式的permutatations。非常适合学习和探索。

希利在坦帕。

enter image description here