Расширение динамической диспетчеризации для вызова функций в модели представления?
Я использую 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
), которого я хочу избежать