ReactiveUI - просмотр производительности локатора
В моемWPF
приложение, которое используетReactiveUI
Я заметил область плохой работы.
У меня есть модель представления, которая содержит много других облегченных моделей представления (думаю, 30). Эти вложенные модели представления просты, обычно представляют собой кнопки. Все они отображаются в пользовательском элементе управления внутриItemsControl
который подключен с использованием ReactiveUIOneWayBind
, Это означает, что каждый элемент отображается с помощьюViewModelViewHost.
На моем мощном настольном ПК при переходе к этой модели вида наблюдается заметная задержка между нажатием кнопки «перейти к модели просмотра» и изменением вида, около 0,5 секунды. Когда я запускаю ту же программу на Power-PC, задержка составляет почти 4 секунды. Это довольно большая проблема с точки зрения UX.
Что я выучилЯ долго пробовал профилировать и отлаживать свой код и не нашел проблемных областей. Zilch (примечание:используя JustMyCode в VS, чтобы ReactiveUI не отображался). Однако я нашел способ устранить проблему. Вместо привязки кItemsControl.ItemSource
сOneWayBind
Я сделал это в XAML, как таковой:ItemSource={Binding MyViewModels}
и настройкаDataTemplate
вручную. Это приводит к гораздо более быстрому переходу.
Когда вы связываете сOneWayBind
сItemsControl
,ViewModelViewHost
автоматически создается для вас, аViewLocator
используется, чтобы найти представление для вашей модели представления. Я предполагаю, что это очень медленно по какой-то причине.
Кто-нибудь знает, как я могу обойти это снижение производительности без необходимости вручную определять множество и множество шаблонов данных для ItemsControl? Если у меня есть view-модели моделей-view-моделей, то все становится очень быстро. Из моего прошлого опыта сCaliburn.Micro
соглашения о расположении вида были очень быстрыми, поэтому мне также интересно, не использую ли яReactiveUI
правильно, и что есть альтернативный подход, который является более быстрым.
Спасибо.
TLDR;ViewModelViewHost
какDataTemplate
для ~ 30 view-models приводит к тому, что при начальной загрузке представления становятся очень вялыми, в результате чего пользовательский интерфейс выглядит так, как будто он аварийно завершился. Есть ли способ избежать этого?