Prism 7.1: IContainerProvider и IContainerRegistry - PullRequest
1 голос
/ 24 июня 2019

Более новый разработчик, работающий над моим вторым приложением и первым использующий Prism 7.1.

Я надеюсь получить небольшую помощь с правильным доступом к ViewModel, зарегистрированному в Shell.xaml.cs.

Вот с чем я работаю:

App.xaml.cs

public partial class App
{
  protected override Window CreateShell()
  {
    return Container.Resolve<Shell>();
  }
  protected override void RegisterTypes(IContanerRegistry containerRegistry)
  {
    containerRegistry.Register<ShellViewModel>();
  }
}

Shell.xaml.cs

public partial class Shell : MetroWindow
{
    public Shell()
    {
        InitializeComponent();
    }
 }

Я могу получить доступ к свойствам моего ViewModel, просто выполнив следующие действия:

var shellVM_Instance = containerProvider.Resolve<ShellViewModel>();
shellVM_Instance.IsBusy = false;

Код скомпилируется, но не запустится.Когда я запускаю код, он говорит мне, что ShellViewModel из вышеупомянутого var shellVM_Instance ссылается на нулевой объект типа ShellViewModel.Это заставляет меня думать, что я неправильно зарегистрировал ViewModel в IContainerRegistry.

Может ли кто-нибудь предложить какую-либо помощь?

Я хотел бы избежать использования класса Bootstrapper и воспользоваться преимуществами того, что Prism7.1 должен предложить ( Примечания к выпуску Брайана )

Я ценю любые советы здесь и ваше терпение, пока я пытаюсь сосредоточиться на Призмы и ее истинном потенциале.

РЕДАКТИРОВАТЬ:

Я вижу, что IContainerRegistry имеет метод RegisterInstance ..

void RegisterInstance(Type type, object instance);

Я не могу на всю жизнь выяснить синтаксис.Мои попытки:

protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        ShellViewModel shell_VM = new ShellViewModel();
        containerRegistry.RegisterInstance<ShellViewModel, shell_VM>();
    }

Спасибо!

-Крис

1 Ответ

1 голос
/ 25 июня 2019

Есть IContainerRegistry и IContainerRegistryExtensions.

Так что вы можете сделать либо

containerRegistry.RegisterInstance( typeof( ShellViewModel ), shell_VM );

, либо в общем случае с методами расширения

containerRegistry.RegisterInstance<ShellViewModel>( shell_VM );

Еще лучше зарегистрировать как синглтон, на тот случай, если у вас есть какие-либо зависимости (которые вам придется решать самостоятельно, в противном случае)

containerRegistry.RegisterSingleton<ShellViewModel>();

При этом вы делаетеэто все неправильно с самого начала.Редко, модель представления - это одиночка.Вместо этого сделайте так, чтобы ваши модели представлений общались через сторонний синглтон (либо EventAggregator, либо один из ваших собственных сервисов).Для вашего случая я предлагаю что-то вроде этого:

public interface IApplicationBusyIndicator : INotifyPropertyChanged
{
    bool IsBusy { get; set; }
}

Затем заставьте модель представления оболочки наблюдать за изменениями IsBusy и активировать или деактивировать ваше ожидание наложения, в то время как другие модели представления или службы устанавливают IsBusy пока они что-то делают.Конечно, вы можете сделать это более изощренным, если у вас есть более одного актера, который делает приложение занятым, и эти действия перекрываются ...

public interface IApplicationBusySetter
{
    IDisposable RequestBusy();
}

Затем покажите экран ожидания, пока всезапросы удаляются.

...