MVVM Xamarin открывает новое окно из ViewModel - как устранить ссылку на представление

Я хочу открыть новое модальное окно, используя шаблон MVVM в приложении Xamarin Forms. Я исследовал открытие нового окна с шаблоном MVVM, который получил меня так далеко, но что касается окон в форматах Xamarin, то им нужна ссылка на текущую страницу (представление), чтобы открыть новое окно (новый вид) из, Это заставляет меня передать ссылку на текущую страницу (представление) из моей модели viewModel на мой заводский завод, чтобы запустить новое окно. Это нарушение MVVM. Моя цель - избавиться от любых ссылок на представления из моей модели viewModel. Это мой вопрос, как мне это сделать? Мой код здесь оказывается модальным окном, но нормальным окнам также нужна ссылка на страницу, с которой она запускается. Вот мой код, и вы увидите, что я имею в виду:

Window Factory (посмотрите на метод CreateNewWindow):

public interface IWindowFactory
 {
 void CreateNewWindow();
 }

 public class ProductionWindowFactory: IWindowFactory
 {
 Page launchFromPage;
 BackLogViewModel viewModel;

 public ProductionWindowFactory(BackLogViewModel ViewModel, Page page)
 {
 viewModel = ViewModel;
 launchFromPage = page;
 }

 public void CreateNewWindow()
 {
 AddStoryPage window = new AddStoryPage (new AddStoryViewModel (viewModel));
 launchFromPage.Navigation.PushModalAsync (window);
 }
 }
}

ViewModel, который открывает новое модальное окно (особенно посмотрите на команду AddTask):

public class BackLogViewModel : INotifyPropertyChanged
 {
 private IWindowFactory m_windowFactory;

 public void DoOpenNewWindow()
 {
 m_windowFactory.CreateNewWindow();
 }

 public ObservableCollection<story> AllMyStories { get; set; }
 private string _updated;
 public string Updated
 {
 get 
 {
 return _updated;
 }
 set 
 {
 _updated = value;
 OnPropertyChanged ();
 }
 }

 public Page mypage;
 public BackLogViewModel (Page page)
 {
 Updated = DateTime.Now.ToString();
 mypage = page;
 AllMyStories = new ObservableCollection<story> ();

 }

 public ICommand Save
 {
 get {
 return new Command (() => {
 Updated = DateTime.Now.ToString();
 });
 }
 }

 public ICommand AddTask
 {
 get {
 return new Command ( () => {
 m_windowFactory = new ProductionWindowFactory(this, mypage);
 DoOpenNewWindow();
 });
 }
 }

 public event PropertyChangedEventHandler PropertyChanged;

 private void OnPropertyChanged([CallerMemberName] string propertyName = null)
 {
 var handler = PropertyChanged;
 if (handler != null) 
 {
 handler(this, new PropertyChangedEventArgs (propertyName));
 }
 }

 private Command selectCmd;
 public Command Select {
 get {
 this.selectCmd = this.selectCmd ?? new Command<story>(p => 
 {
 var monkey = p as Story;
 if (monkey == null) return;
 Page z = new Views.StoryPage(p);
 mypage.Navigation.PushAsync(z);
 }
 );
 return this.selectCmd;
 }
 }
 }
}
</story></story></story>

Как мне избавиться от ссылки на текущую страницу (просмотр) в моей модели просмотра?

1 ответ

С тех пор я нашел этот учебник по навигации видов из ViewModel в Xamarin

В основном это делает то, что я уже делал, но вместо того, чтобы передавать полный вид ViewModel, он передает только интерфейс INavigation этого представления и использует его для навигации. В нем говорится, что можно утверждать, что он нарушает MVVM, но имеет отношение "так оно и есть", я подозреваю, потому что нет очевидных и простых альтернатив. Могут быть альтернативы, которые не ссылаются ни на какую часть представления из ViewModel, но для того, чтобы продолжать двигаться вперед, я выбрал это простое решение. Я сохранил свою фабрику окон, чтобы не указывать конкретное окно для сборки в моей модели ViewModel.

licensed under cc by-sa 3.0 with attribution.