我在Xamarin应用程序中使用MVVM,我有一个在页面之间导航的界面:
public interface INavigate
{
INavigate Next();
INavigate Previous();
string ViewTitle { get; }
}
在实施视图中:
public partial class V2Upload : ContentView, INavigate
{
public string ViewTitle => "Upload photos";
public INavigate Next()
=> new V3AdDetail();
public INavigate Previous()
=> new V1Agreement();
}
并在视图模型中
我有一个INavigate
类型的属性:
public INavigate CurrentAddItemStep
{
get { return _currentAddItemStep; }
set { Set(ref _currentAddItemStep, value); }
}
,并且父视图的Content属性绑定到此属性:
单击下一个按钮时,我将执行以下代码:
CurrentAddItemStep = CurrentAddItemStep.Next();
ViewTitle = CurrentAddItemStep.ViewTitle;
在导航到所有“内容”视图的下一页之前,现在需要一种验证方法。
我想通过不在视图中编写业务代码来保持MVVM模式尽可能干净,例如,在V2Upload
视图中,视图模型的File1
和File2
属性不应是null
:
private bool ValidateFiles(){
return (File1 ?? File2) != null;
}
但是由于导航是在运行时动态完成的,所以我不知道哪个视图是当前视图。 我正在考虑使用反射,知道视图的名称是什么(但这会破坏整个设计)
另一种选择是向Next
方法提供一个函数参数,又如何在设计时从视图模型中提供它?
这就是我现在正在做的事情:
public INavigate Next()
{
if (((ViewModel.AddItemViewModel)BindingContext).ValidateFiles())
return new V3AdDetail();
else
return this;
}
但是,再次,我要从视图访问视图模型(并且必须将ValidateFiles
方法从private
更改为public
),