Способ, которым я это делаю, - это иметь класс центрального контроллера, о котором все ViewModels знают, через интерфейс.Затем я устанавливаю это состояние перед тем, как телефон выполнит навигацию за меня.Затем каждая ViewModel опрашивает этот центральный класс для нужного ему состояния.
Для меня есть ряд преимуществ:
- Это позволяет мне иметь нестатические ViewModels.
- Я могу использовать Ninject, чтобы внедрить конкретную реализацию класса контроллера и определить его как единичный объект.
- Самое главное, что при захоронении нужно только захватить текущую ViewModel и класс контроллера.
Я столкнулся с проблемой обмена сообщениями, когда мой ViewModel был зарегистрированным слушателем, потому что я был View First, а не ViewModel First, я был вынужден использовать статические ссылки ViewModel.В противном случае ViewModel не был создан вовремя для получения сообщения.
Я использую класс контроллера в сочетании с сообщениями (он в основном является получателем всех сообщений вокруг пользовательского интерфейса), поэтому в будущем, если я проведу рефакторинг, яне нужно много менять, только получатели сообщений.
Если подумать, класс контроллера - это тоже мой приемник навигации - так как у меня есть некоторый пользовательский код навигации, который пропускает переход по страницам на определенных страницахи т. д.
Вот пример моей текущей настройки:
public interface IController
{
Foo SelectedFoo { get; }
}
public class ViewModel
{
private IController _controller;
public ViewModel(IController controller)
{
_controller = controller;
}
private void LoadData()
{
// Using selected foo, we load the bars.
var bars = LoadBars(_controller.SelectedFoo);
}
}