Показать представление из non-view/viewmodel в mvvmcross
Как правильно открыть представление в mvvmcross без просмотра? Из модели представления мы будем использовать ShowViewModel<>(..).
В частности, мы отвечаем на push-уведомление об открытии приложения (с пользовательской полезной нагрузкой), которое диктует представление, которое должно быть загружено.
У нас есть хакерский обходной путь только для доказательства концепции, просто хотелось получить представление о правильном подходе MVX
2 ответа
Я не думаю, что есть "правильный путь" - я думаю, что это зависит от вашего приложения и того, что вам нужно для этого.
Для некоторых конкретных случаев - например, ViewModel->ViewModel и AppStart - MvvmCross предоставляет несколько удобных методов:
- ты можешь позвонить
ShowViewModel
вMvxViewModel
- запуск приложения может быть переопределен для использования объекта подсказки - см. https://speakerdeck.com/cirrious/appstart-in-mvvmcross
Но в целом, любой класс может запросить ShowViewModel
по телефону:
var viewDispatcher = Mvx.Resolve<IMvxViewDispatcher>();
viewDispatcher.ShowViewModel(new MvxViewModelRequest(
viewModelType,
parameterBundle,
presentationBundle,
requestedBy));
Кроме того, существует базовый класс - MvxNavigatingObject.cs, который может помочь в этом (это базовый класс MvxViewModel и MvxAppStart), так что вы можете легко предоставить одну или несколько услуг, таких как INavigateMyselfService
чьи реализации наследуют MvxNavigatingObject
,
public interface INavigateMyselfService
{
void GoWild(string side);
}
public class NavigateMyselfService
: MvxNavigatingObject
, INavigateMyselfService
{
public void GoWild(string side)
{
ShowViewModel<WildViewModel>(new { side = side });
}
}
http://forums.xamarin.com/discussion/4694/conditionally-call-registerappstart-with-mvvmcross
Проверьте ссылку выше, и вы получите идею
В моем случае я хочу запустить приложение из вторичной плитки. Для этого мне нужно запустить определенную страницу для вторичной плитки.
Моя начальная модель начального представления приложения - LoginViewModel, а моя пользовательская модель начального представления приложения - HomeViewModel.
Я управлял этим из App.cs (Core) в класс MyCustomAppStart.
См. Ссылку выше