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