Создание нового экземпляра View / ViewModel с использованием Prism / MVVM - PullRequest
0 голосов
/ 07 июля 2019

Я новичок в WPF / MVVM и работаю над проектом, в котором я интегрировал элементы управления вкладками Dragablz таким образом, что мне нужен эквивалент new OEEView() для создания нового окна в области содержимого новый объект вкладки.

Однако, в ctor представления, которое я использую (OEEView), ему нужно передать viewModel. Я попытался создать новый OEESelectionViewModel в коде создания вкладки и передать его новому OEEView (), но его ctor по умолчанию выглядит как public OEESelectionViewModel(IDialogService dialogService, IOEELogger oeeLogger, ISettingsManager settingsManager), и я не уверен, как эти I-объекты передаются. Из того, что я понял, это ответственность Prism и разрешение зависимостей с помощью внедрения зависимостей. Я также пытался создать конструктор по умолчанию (без аргументов) для OEEView и создать в нем новую OEESelectionViewModel, но я все еще застрял с точки зрения использования DI-модуля Prism.

        public OEEView(OEESelectionViewModel viewModel)
        {
            InitializeComponent();
            DataContext = viewModel;
            _viewModel = viewModel;
        }
        public OEESelectionViewModel(IDialogService dialogService, IOEELogger oeeLogger, ISettingsManager settingsManager)
        {
            ...
        }
        public TabView()
        {
            InitializeComponent();

            var tab = new HeaderedItemViewModel
            {
                Header = new HeaderWithCloseViewModel
                {
                    Header = "OEE Chart #1"
                },
                Content = new OEEView()
            };

            var viewModel = new TabViewModel(tab);

            DataContext = viewModel;
            _viewModel = viewModel;
            this.Show();
        }

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

_container = new Container();
_container.Register<OEEView>(Reuse.Singleton);
OEEView client = _container.Resolve<OEEView>();

Additional information: Unable to resolve StationControl.ViewModels.OEESelectionViewModel as parameter "viewModel"

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Однако, в ctor представления, которое я использую (OEEView), ему нужно передать viewModel.

Нет, это не так.Это плохой стиль, и его следует использовать как последнее средство.Представление подключается к модели представления исключительно через привязки из xaml, если только вы не сталкиваетесь с действительно исключительными условиями.

То, что вы хотите сделать, - это использовать присоединенное свойство ViewModelLocator.AutowireViewModel=true.Это позаботится о том, чтобы представлению волшебным образом была назначена разрешенная модель представления, без необходимости помещать что-либо в код позади.

Существует соглашение по умолчанию, но вы можете изменить его, если необходимо адаптироватьв вашей ситуации.Или вы можете зарегистрировать отображение из вида для просмотра модели (-типа) вручную для каждого вида.

0 голосов
/ 08 июля 2019

Обычно вы выполняете следующие шаги:

  • убедитесь, что ваша viewmodel реализует интерфейс, т.е. IOEESelectionViewModel
  • отобразите (зарегистрируйте) ваш новый интерфейс (IOEESelectionViewModel)для конкретного типа (OEESelectionViewModel) в процессе регистрации типа контейнера DI
  • при создании нового представления используйте контейнер IOC (DI) для разрешения интерфейса с конкретным экземпляром модели представления

При использовании PRISM ваши строки кода, разрешающие новый конкретный экземпляр, будут выглядеть примерно так:

var myVM = myIocContainer.Resolve<IOEESelectionViewModel>();
var myView = new OEEView(myVM);

Конечно, если вы хотите быть сверхчистым, вы также можете получитьВаше представление разрешается и создается с помощью контейнера DI.
Когда вы разрешаете конкретный экземпляр интерфейса, контейнер DI создает этот экземпляр, а также автоматически разрешает (и создает) зависимости, указанные в конструкторе.Это является частью красоты использования DI-фреймворка - как только вы зарегистрируете сопоставления, происходит волшебство.Многие повторяющиеся сложности устраняются с помощью шаблонов IOC и контейнера DI.

...