【问题标题】:Page Navigation using MVVM pattern without using existing MVVM frameworks使用 MVVM 模式的页面导航而不使用现有的 MVVM 框架
【发布时间】:2017-04-12 10:49:10
【问题描述】:

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

我有以下 MVVM 文件

  1. 登录查看
  2. Lo​​ginViewModel
  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));


        }
    }

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

现在我想导航到我的MainPage,这是用户成功登录后的母版页,因此当eventType.statusMessage Subscriber 中为真时,我需要导航到母版页

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

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

【问题讨论】:

  • Application.Current.MainPage = new MyFirstPageAfterLogin();不正确?
  • 这会是在 MVVM 模式中执行此操作的正确方法吗?不过不确定:)
  • 我不知道...我认为您应该将 MessagingCenter 从 ViewModel 发送到 View 并在 View 中使用 Application.Current.MainPage = new... 但我不确定。我不是很了解 MVVM...

标签: xamarin mvvm xamarin.forms


【解决方案1】:

MVVM 没有提到导航,所以基本上每个选项都可以。

唯一反对代码的东西是:

Application.Current.MainPage = new MyFirstPageAfterLogin();

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

所以当我想导航到PageAfterLoginPage 时,我创建了一个PageAfterLoginPageModel。从我的 ViewModel(或 Xamarin 命名中的 PageModel)我现在可以导航到 PageModel,而不是对页面进行硬引用。这样一来,Page 和 PageModel 就分开了,如果我愿意,我可以轻松地换掉 View。

所以,要么使用现有的框架,要么查看他们的 Github 存储库,看看他们是如何做到的,如果你坚持自己做的话。

【讨论】:

  • 里面的逻辑理解起来相当复杂,甚至没有相关文档
  • 这不是火箭科学。 This is PageModel 被推送的地方。只需按照从那里调用的方法,您应该会看到您需要的所有代码。那你更具体地追求的是什么?我想我让你很好地了解了事情的现状以及你可以从这里走向何方。
  • 是的,我知道这不是一门火箭科学,但这里的问题是 xamarin 和 C# 的新手
  • 好的,再说一遍;你在找什么?你能用这个答案吗?你还需要什么?
  • 需要一种简单的方法来实现我自己的导航服务
【解决方案2】:

使用最新工具执行文件/新项目/跨平台/主从。主从模板都是 MVVM,不使用任何 3rd 方框架。有本机和形式的排列。非常适合学习和探索。

坦帕的希利。

【讨论】:

  • 我在 Visual Studio 2015 中没有看到这个选项,请问我怎样才能得到那个模板?
  • 您的 Xamarin 是最新版本吗?工具>Xamarin>检查更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2011-05-23
  • 2017-09-01
相关资源
最近更新 更多