Как загрузить DataService перед MainViewModel при использовании MVVMLight ViewModelLocator в приложении WPF? - PullRequest
0 голосов
/ 23 января 2019

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

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

  • ViewModelLocator инициализируется в App.Xaml.
  • ViewModels и DataServices зарегистрированы и работают нормально.

В моем App.xaml.cs основной вид загружается следующим образом.

var mainWindow = new View.MainWindow();
mainWindow.Show();

Для предварительной загрузки моей службы данных я установил для своей службы данных значение createInstanceImmediately, а затем добавил следующий код чуть выше кода mainWindow.

DataService dataService = SimpleIoc.Default.GetInstance<IDataService>();

Эта строка создает исключение "CommonServiceLocator.ActivationException: 'Тип не найден в кэше: Namespace.IDataService.'"

Если переместить эту строку ниже кода mainWindow, она работает просто отлично.

Моей первой мыслью было, что это проблема синхронизации, но если я добавлю задержку, я все равно получу ошибку. Таким образом, кажется, что ресурс приложения не загружается до тех пор, пока не будет загружено представление. Я бы не подумал, что это так, поскольку app.xaml и app.xaml.cs действительно являются частью одного класса. Несмотря на это, я не уверен, как обойти это, или если я даже могу.

Почему ViewModelLocator не загружается без представления? Есть ли способ заставить его загрузить ресурс приложения вручную? Или есть лучший способ?

1 Ответ

0 голосов
/ 01 марта 2019

Я наконец нашел решение.

Хитрость в том, чтобы вручную создать экземпляр ViewModelLocator из ресурсов приложения.

private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator

При необходимости к моделям представлений можно обратиться через viewModelLocator.Main (или любое другое имя свойства, которое вы назначаете).

Размещение этого бита важно. Он не будет работать из конструктора приложений, но работает из обработчика событий Application_Startup. Я закончил тем, что добавил собственный класс, который загружаю из Application_Startup, больше для того, чтобы сохранить мой App.xaml.cs чистым, чем в противном случае.

После использования этого в течение некоторого времени, я полюбил это и могу начать использовать чаще. Это позволяет легко подключать мои события между моделями представления, когда мои потребности не требуют службы обмена сообщениями.

...