Xamarin.Forms如何使用MVVMLight切换页面

Xamarin.Forms How to switch pages using MVVMLight

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

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

我已经尝试通过 VM 构造函数传递导航,就像这里描述的那样:

但是当我尝试这个方法时,在MainPage的"LoadApplication(new DemoMVVM2.App());"处发生了错误。

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

但我不知道如何通过 ViewModel 切换页面并保持 header 带后退按钮。

您可以将回调传递给您的 ViewModel(VM) 并在 Command 或任何调用页面(视图)中的导航代码的操作上。这样您就可以将导航代码保留在页面中,将绑定逻辑保留在 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()
    }
}

通常在使用 MVVMLight 时,您将使用 NavigationService。 由于 MVVMLight 中的 IOC 构建,此 class 可以构造函数注入到您的 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