#xamarin.forms #mvvmcross #syncfusion
#xamarin.forms #mvvmcross #синхронизация
Вопрос:
У меня проблема, когда несколько моих страниц используют элемент SfBackdropPage
управления из Syncfusion. Этот элемент управления требует, чтобы у страницы была база SfBackdropPage
, а не обычная ContentPage
, иначе она просто не будет работать.
Чтобы MvvmCross работал, страница должна иметь базу, такую как MvxContentPage
Вы видите, к чему это ведет?
Я открыл заявку с помощью Syncfusion, чтобы узнать, могут ли они обойти эту проблему, но в основном они просто сказали, что это невозможно. Итак, поскольку мне нужно было иметь этот элемент управления как часть страницы, мне пришлось оставить базу такой, какой она была.
Как настроить MvvmCross для работы с этими страницами без наследования страницы MvxContentPage
?
Я использовал следующее setup.cs
в проекте Android:
protected override IMvxViewsContainer InitializeViewLookup(IDictionary<Type, Type> viewModelViewLookup)
{
viewModelViewLookup.Add(typeof(SitesViewModel), typeof(SitesView));
return base.InitializeViewLookup(viewModelViewLookup);
}
Я могу перейти на страницу, но получаю исключение с нулевой ссылкой из-за того, что контекст привязки не был установлен. Я пытался установить это в XAML, но для этого требуется конструктор без параметров, но это невозможно, поскольку модель представления использует внедрение зависимостей, поскольку она полагается на переданный объект.
Может кто-нибудь дать какие-либо указания, я все еще изучаю MvvmCross, так что, надеюсь, я что-то пропустил.
XF: 4.8.0.1687 MvvmCross: 7.1.2
ОБНОВЛЕНИЕ 1: я попытался найти что-нибудь в источнике MvvmCross, чтобы посмотреть, как он выполняет настройку для контекста привязки, но я ничего не нашел. Итак, на данный момент я вручную создаю контекст привязки в коде страницы и использую Mvx.IocProvider.Resolve<>
для передачи необходимых интерфейсов.
Я не уверен, что это лучший способ обойти эту проблему, но это работает. Может быть, есть лучший способ?
ОБНОВЛЕНИЕ 2: похоже, что маршрут обновления 1 бесполезен, поскольку при этом создается новый экземпляр виртуальной машины, который и следовало ожидать, но экземпляр уже существует, который создается платформой MvvmCross. Вопрос в том, как мне получить экземпляр виртуальной машины из исходного кода? Единственный способ, который я нашел до сих пор, — это использовать IMvxOverridePresentationAttribute
и привести запрос MvxViewModelInstanceRequest
, который затем разрешает доступ к экземпляру виртуальной машины, который я назначаю контексту привязки. Возможно, мне лучше задать еще один вопрос относительно наилучшего подхода к этому методу.
Комментарии:
1. Для немного более чистого решения вы можете определить конструктор без параметров в виртуальной машине и разрешить интерфейсы внутри него. Затем вы можете установить контекст привязки в XAML. Это в значительной степени то, что у вас есть в вашем обновлении, но оно переносит разрешение зависимостей из исходного кода в виртуальную машину.
2. Спасибо за идею, Эндрю, я никогда об этом не думал. Просто надеюсь, что придет какой-нибудь эксперт MvvmCross и скажет мне, что есть гораздо лучший способ сделать это.