【问题标题】:Xamarin.Forms How to switch pages using MVVMLightXamarin.Forms 如何使用 MVVMLight 切换页面
【发布时间】:2018-08-03 11:51:47
【问题描述】:

我目前正在开发一个使用 .NET Standard 作为代码共享策略的 Xamarin.forms 项目。我尝试通过 MvvmLightLibsStd10 库来使用 MVVM 模式。我已经使用本教程成功设置了 MVVM 结构: https://www.linkedin.com/pulse/build-xamarinforms-net-standard-mvvm-light-app-rafael-carvalho

我不能使用 Navigation.PushAsync(new Page());因为它只适用于后面的代码,而不适用于 ViewModel。

我已经尝试通过 VM 构造函数传递导航,就像这里描述的那样:
Xamarin.form Page Navigation in mvvm

但是当我尝试这种方法时,“LoadApplication(new DemoMVVM2.App());”出现错误在主页中。

如何使用 MVVM Xamarin.Forms 和 MVVMLight 切换页面(基于我第一个 url 中的代码)?

但我不知道如何通过 ViewModel 切换页面并将标题与后退按钮保持一致。

【问题讨论】:

    标签: xamarin xamarin.forms mvvm-light .net-standard


    【解决方案1】:

    通常在使用 MVVMLight 时,您将使用NavigationService。 由于 MVVMLight 中的 IOC 内置,此类可以在您的 VM 中注入构造函数。 有了它,您可以在 VM 中执行 NavigateGoBack,触发当前堆栈上的真正导航。

    您可能错过的唯一一件事是您需要自己为 Xamarin 表单编写一个。 但是 Laurent Bugnion(MVVMLight 的所有者)在此处提供了一个示例: https://github.com/lbugnion/sample-2016-vslive-crossplatform/blob/master/Flowers/Flowers.Forms/Flowers.Forms/Helpers/NavigationService.cs

    【讨论】:

      【解决方案2】:

      您可以将回调传递给您的 ViewModel(VM) 和 Command 或任何调用您页面 (View) 中的导航代码的操作。这样您就可以将导航代码保留在页面中,并将绑定逻辑保留在 ViewModel 中。

      interface NavHandler{
          void navigateToSomeView();
      }
      
      public class MyPage : ContentPage,NavHandler{
           public MyPage(){
               BindingContext = new MyViewModel(this);
           }
           void navigateToSomeView(){
               Navigation.PushAsync(new Page2());
           }
      } 
      
      public class MyViewModel{
          NavHandler handler;
          public MyViewModel(NavHandler handler){
              this.handler = handler
          }
          //Your action
          this.btnClicked = new Command(async()=>{
              handler.navigateToSomeView()
          }
      }
      

      【讨论】:

      • 我尝试了您的建议,但现在,每次运行应用程序时,无论是 UWP 还是 Android,我都会收到“没有为此对象定义无参数构造函数”。但是 App 只有 1 个实际上是无参数的 ctor。你可以在这里下载我的源代码:https://we.tl/byHWdsjyFN
      • 你应该调用带有参数的构造函数,如上面代码中的BindingContext = new MainViewModel(this);,这是你在MainViewModel.cs中定义的构造函数
      猜你喜欢
      • 2014-09-29
      • 2020-05-04
      • 2023-04-08
      • 2016-06-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多