Диалоговое окно Prism: не удается разрешить корневой объект разрешения

#c# #wpf #prism

#c# #wpf #prism

Вопрос:

Я пробовал это с Prism 8.0.0.1909 и dotnet core 3.1 и 5. Для моего диалога у меня есть представление:

 <UserControl
x:Class="xzy.Modules.CapillaryBatchwise.Dialogs.NewBatchDialog"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
...
</UserControl>
 

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

 namespace zxy.Modules.CapillaryBatchwise.ViewModels
{
public class NewBatchDialogViewModel : BindableBase, IDialogAware
    {
        ...
        public string Title => "MyTitle";
        public event Action<IDialogResult> RequestClose;
        public bool CanCloseDialog() => true;

        public void OnDialogClosed()
        { }

        public void OnDialogOpened(IDialogParameters parameters)
        { }
    }
}
 

Я зарегистрировал модель представления и представления в своем App.xaml.cs

 namespace xyz.CapillaryJournal
{
    public partial class App
    {
        ...
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterDialog<NewBatchDialog, NewBatchDialogViewModel>();
        }
}}
 

А затем вызовите его из моей фактической ViewModel

  public class CapillaryBatchNavigationViewModel : BindableBase
    {
        private readonly IDialogService dialogService;

        public CapillaryBatchNavigationViewModel(//...
                                                 IDialogService dialogService)
        {
            ///...
            ShowNewBatchDialogCommand = new DelegateCommand(ShowNewBatchDialog);
            this.dialogService = dialogService;
            //...
        }
        public DelegateCommand ShowNewBatchDialogCommand { get; }
        private void ShowNewBatchDialog()
        {
            dialogService.ShowDialog(nameof(ShowNewBatchDialog));
        }
        //...
    }
 

Однако, когда я вызываю ShowNewBatchDialogCommand с моей точки зрения, я получаю это исключение, в котором я не могу разобраться:

 Prism.Ioc.ContainerResolutionException: 'An unexpected error occurred while resolving 'System.Object', with the service name 'ShowNewBatchDialog''

Inner Exception
ContainerException: code: Error.UnableToResolveFromRegisteredServices;
message: Unable to resolve Resolution root Object {ServiceKey="ShowNewBatchDialog"}
  from container without scope
 with Rules with {TrackingDisposableTransients, UseDynamicRegistrationsAsFallbackOnly, FuncAndLazyWithoutRegistration, SelectLastRegisteredFactory} and without {ThrowOnRegisteringDisposableTransient, UseFastExpressionCompilerIfPlatformSupported}
 with FactorySelector=SelectLastRegisteredFactory
 with Made={FactoryMethod=ConstructorWithResolvableArguments}
  with normal and dynamic registrations:
  ("NewBatchDialog", {FactoryID=160, ImplType=xyy.Modules.CapillaryBatchweise.Dialogs.NewBatchDialog, Reuse=TransientReuse})  ("TaskPresenter", {FactoryID=177, ImplType=xyy.Modules.CapillaryBatchweise.Views.TaskPresenter, Reuse=TransientReuse})
 

Это в основном немного изменено, что было сделано в этом документе: https://prismlibrary.com/docs/wpf/dialog-service.html

Я не могу определить, что не так с моим кодом.

Комментарии:

1. Как называется представление? NewBatchDialog или ShowNewBatchDialog ?

Ответ №1:

Вы должны вызвать dialogService.ShowDialog(nameof(NewBatchDialog)); , поскольку имя представления NewBatchDialog while ShowNewBatchDialog является именем какого-либо несвязанного метода.

Или вы можете зарегистрировать представление с определенным именем, например containerRegistry.RegisterDialog<NewBatchDialog, NewBatchDialogViewModel>( "ShowNewBatchDialog" );

Комментарии:

1. О боже, я просто перепутал имя представления и имя моего метода! Спасибо, я просто смотрел на него 3 часа, но не мог его обнаружить!

2. Еще раз спасибо! Я чувствую себя несколько смущенным собой.