将动态分派扩展到视图模型中的调用函数?

时间:2019-01-06 10:34:45

标签: c# oop dynamic-dispatch

我在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视图中,视图模型的File1File2属性不应是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),

>

0 个答案:

没有答案