xamarin - 在不使用现有MVVM框架的情况下使用MVVM模式进行页面导航

标签 xamarin mvvm xamarin.forms

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

我有以下用于MVVM的文件

  • 登录查看
  • LoginViewModel
  • 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));
    
    
            }
        }
    

    当从Button触发OnLogin命令并使用Message广播MessageCenter时,此类通常会进行网络服务调用

    现在,我想导航到我的MainPage,即用户成功登录后的母版页,因此当eventType.status中的Message Subscriber为true时,我需要导航到母版页

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

    我尝试在网上搜索,发现有现成的框架可用,例如MVVMCrossMVVMLight等。但是我不想使用那些依赖项,如果有人可以建议,我愿意以其他方式实现导航

    最佳答案

    MVVM并没有说明导航,因此基本上每个选项都可以。

    唯一反对代码的东西是:
    Application.Current.MainPage = new MyFirstPageAfterLogin();
    是您现在对ViewModel中的页面进行了引用,而这并不是您想要的。这就是为什么MVVM框架倾向于实现称为ViewModel-to-ViewModelnavigation的概念的原因。这样,您可以指定要导航到的ViewModel。根据框架(或实现方式)的不同,您可以先注册一个耦合或使用一个命名约定。例如;我喜欢使用FreshMvvm,它通过命名约定来实现。

    因此,当我想导航到PageAfterLoginPage时,我创建了PageAfterLoginPageModel。现在,我可以从ViewModel(或Xamarin命名中的PageModel)导航到PageModel,而不必对页面进行硬引用。这样,Page和PageModel是分开的,如果需要,我可以轻松地换出View。

    因此,可以使用已有的框架,也可以查看他们的Github存储库,看看如果您坚持要自己做的话。

    关于xamarin - 在不使用现有MVVM框架的情况下使用MVVM模式进行页面导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43367444/

    相关文章:

    javascript - ExtJS5 MVVM 本地存储

    mvvm - 模板 10 UWP 如何绑定(bind)到 MenuFlyoutItem 内的 autoSuggestBox

    Xamarin.iOS - 应用程序名称 'App.exe' 与另一个用户程序集冲突

    c# - Xamarin.Android 中的位图旋转

    ios - 撰写电子邮件时设置 UINavigationBar 标题颜色

    c# - Xamarin.Forms:独立于平台的应用程序菜单

    xamarin.forms - 错误 : error MT: Failed to launch the simulator. MT0069:应用程序目录不存在

    ios8 - NSInputStream 从不在 iOS9(经典蓝牙)上使用 HasBytesAvailable

    wpf - 如何连接 ViewModel 中的撤消命令以供 Ctrl-Z 调用?

    c# - 如何在 Xamarin.Forms 上使用 System.Data.SQLite Interop.dll?