Расширение динамической диспетчеризации для вызова функций в модели представления? - PullRequest
0 голосов
/ 06 января 2019

Я использую MVVM в приложении Xamarin, у меня есть интерфейс для навигации по страницам:

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), которого я хочу избежать

...