2016-09-12 3 views
0

Я пытаюсь Prism.Forms для моего следующего клиентского проекта. К сожалению, я вижу странное поведение с моими образцами.Призма для Xamarin.Forms неспособна AutoWire

Pretext Похоже XF или Prism не нравится включая существующую страницу XAML (также упоминается Брайан Lagunas - Человек - сам на заседании Evolve). Но переименование страницы также отменяет ее, и ViewModelLocator больше не может найти ViewModel. Даже если я заново создаю страницу с тем же именем, она не может найти ее ViewModel. Ручная настройка BindingContext работает, но я стараюсь не создавать зависимости для инсталляции конструктора.

Вопрос При работе над существующим кодом незначительное изменение вызвало исключение NullReference при использовании NavigationPage в качестве корня. Вот пример приложения рабочего образца

https://github.com/hnabbasi/xamarin/tree/master/XFPrism/XFPrism

Я использую NavigationPage и толкая ContentPage. Затем я нажимаю еще один ContentPage, затем показываю страницу Modal посредством нажатия кнопки и общения. Я отправляю параметры на вторую страницу контента через NavigationParameters.

Чтобы разбить его, попробуйте поменять место службы ISayHello с помощью службы IPageDialogService. Я не уверен, что происходит, это нарушает его.

Заранее спасибо :)

+0

ОК. Нашел проблему с переименованием. Я обнаружил, что, когда представления не были непосредственно под пространством имен «Просмотры» (т. Е. Views.Pages или Views.Dashboard), они не загружались. Перемещение их непосредственно под «Views» работало без ошибок. Кроме того, мне пришлось удалить явное объявление AutowireViewModel = "True" в XAML, поскольку оно уже позабочено ViewModelLocator. Затем ViewModelLocator смог найти и привязать мои взгляды просто отлично. Все еще не уверены в NullReference при вызове метода введенной службы из конструктора. – hnabbasi

ответ

0

Как уже упоминалось Дэн С. в комментариях. MainPage не задан, когда я вызывал PageDialogService для отображения предупреждения, а значит, и NullReference.

Если вам действительно нужно сделать что-то подобное, когда вы хотите как-то подождать, пока что-то закончите, попробуйте Task.Yield().

Я установил свой сценарий, как показано ниже,

// will yield for current operation of page appearing 
    await Task.Yield(); 

    // by now, the page has appeared and set, so this should work fine 
    SayHiCommand.Execute(this); 

Я использовал этот обходной путь в прошлом. Если вы знаете лучший способ передать это, прокомментируйте это.

0

INavigationService именованный тип и, как я помню, известное ограничение единства в том, что названные типы должны предшествовать неназванные типов.

+0

Я попытался перестроить зависимости в конструкторе, но это не помогло. То, что я смущен в приведенном выше примере, заключается в том, что мой ISayHello-сервис отлично работает при вызове конструктора, так же как и в InavigationService, но IPageDialogService этого не делает. – hnabbasi

+1

Ошибка, которую вы получаете, по-видимому, связана с тем, что вы делаете это со своей главной страницы. Если вы попытаетесь выполнить сервис диалога страницы из конструктора или OnNavigatedTo Xamarin.Forms.Application.Current.MainPage по-прежнему является нулевым. Из-за этого служба диалогового окна страницы не может вызвать метод оповещения Xamarin Forms Display Alert.Как только страница будет отображаться, и вы нажмете кнопку «Say Hi», она сможет выполнить, так как MainPage действительно установлен. –

+0

Вы правы. MainPage имеет значение null, когда PageDialogService пытается его использовать. Спасибо :) – hnabbasi

Смежные вопросы