#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. Еще раз спасибо! Я чувствую себя несколько смущенным собой.