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

时间:2018-02-23 12:10:06

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

我目前正在使用 .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());”发生错误。在MainPage。

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

但我不知道如何通过ViewModel切换Pages并使用后退按钮保留标题。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将回调传递给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()
    }
}