Расширение динамической диспетчеризации для вызова функций в модели представления?

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

0 ответов

Другие вопросы по тегам