我目前正在使用 .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并使用后退按钮保留标题。
答案 0 :(得分:1)
通常在使用MVVMLight时,您将使用NavigationService
。
由于MVVMLight中的IOC构建,此类可以在VM中注入构造函数。
有了它,您可以在VM中执行Navigate
和GoBack
,在当前堆栈上触发实际导航。
只有您可能错过的事实是,您需要自己为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()
}
}