Призма для форм Xamarin Инициализация вызывается после установки BindingContext - PullRequest
0 голосов
/ 11 марта 2020

Я надеюсь расширить этот пост здесь { ссылка }

Я не совсем понимаю последовательность событий, которые происходят во время инициализации view и viewmodel при использовании Prism. Дэн объяснил это хорошо, но я все еще что-то упускаю.

Мой сценарий прост: я передаю идентификатор в параметрах навигации, который модель представления будет использовать для поиска некоторых данных из службы, что все делается в методе Initialize. Однако проблема в том, что свойства представления запускаются до вызова метода Initialize, что означает, что у меня еще нет данных для отображения, что создает дополнительную работу для меня.

Дэн предоставил отличное объяснение последовательности событий

  1. Представление создано (выполняется все в ctor представления)
  2. Если вы специально добавили свойство ViewModelLocator.AutowireViewModel, это разрешит ViewModel как часть ctor
  3. Если вы специально не отказались от Autowire ViewModelLocator, служба навигации установит его для вас (после завершения ctor)
  4. Затем NavigationService вызовет IAutoInitialize / IInitialize / InitializeAsyn c (для Prism 7.2 + ... INavigatingAware.OnNavigatingTo в более старых версиях Prism)
  5. Затем NavigationService помещает sh страницу в стек навигации (обратите внимание, что это может или может быть невидимым для пользователя, так как дополнительные страницы могут иметь o будет добавлен первым при глубокой связи)
  6. Затем NavigationService вызовет OnNavigatedFrom / OnNavigatedTo (именно здесь люди часто сообщают о видимой задержке из-за обновлений привязки.

Вот где мне нужна помощь :

Я предполагаю, что шаг 3, где Дэн говорит, что «Служба навигации установит его для вас» означает, что BindingContext представления установлен в это время? Итак, BindingContext устанавливается после ctor, но перед методом Initialize? Это означает, что все свойства, установленные в методе Initialize, всегда будут запускаться дважды, один раз, когда установлена ​​привязка, и снова со свойствами, установленными через Initialize или Autoinitialize?

В моем случае это не идеально, так как все свойства должны быть вызваны в методе Initialize, и я должен обработать все нулевые случаи.

Я действительно не хочу делать все вручную, отказавшись от автопровода, но я не вижу других вариантов, я что-то упустил? Кто-нибудь знает, возможно ли изменить Prism для задержки установки BindingContext до тех пор, пока не будет вызван метод Initialize?

Спасибо.

1 Ответ

1 голос
/ 11 марта 2020

Метод инициализации, предлагаемый Prism:

  • IInitialize.Initialize
  • IIniaializeAsyn c .InitializeAsyn c
  • IAutoInitialize

Будет запущен только ОДИН раз.

Поскольку ViewModelLocator специально отказывается от подписки, существует два способа его работы.

  1. Вы явно установили свойство AutowireViewModel либо в своем XAML, либо в коде View для тех, кто действительно любит закодированный пользовательский интерфейс. Это означает, что BindingContext вашего View будет установлен как часть его конструктора.
  2. Вы позволили NavigationService Prism установить AutowireViewModel для вас. Это означает, что конструктор View уже завершен. После установки свойства будет установлен контекст привязки.

Хотя я обычно использую 2-й метод, чтобы сохранить мой код чистым, включаю только явный выбор, когда есть крайний случай, который требует этого, в конечном итоге это не имеет значения, какой из двух методов вы выберете. На этом этапе конструкторы вашего View и ViewModel были выполнены, и ViewModel установлен как BindingContext для View, однако Prism не вызывает метод Initialize.

Только с полностью раздутыми View и ViewModel (вызванные конструкторы и набор BindingContext) Prism фактически начнет процесс инициализации, как объяснено в вопросе SO, на который вы ссылались: { ссылка }

Надеюсь, чтобы сделать это немного яснее, рассмотрим следующие комментарии в ViewModel ниже

public class SampleViewModel : IInitialize, INavigationAware
{
    public SampleViewModel()
    {
        // Called when we inflate the SampleViewModel object
        // This is then added as the BindingContext of the View

        // NOTE: You CAN NOT access Navigation Parameters from here!!!!
    }

    public void Initialize(INavigationParameters parameters)
    {
        // Called before the View (Xamarin.Forms Page) is pushed onto the Navigation Stack
    }

    public void OnNavigatedFrom(INavigationParameters parameters)
    {
        // Called when the View is Navigated away from
    }

    public void OnNavigatedTo(INavigationParameters parameters)
    {
        // Called any time the View is is Navigated to, or back to... 
        // and AFTER Initialize...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...