MvvmCross-Wpf CustomPresenter

MvvmCross - Wpf CustomPresenter

我正在尝试使用 MvxWpfViewPresenter 从一个视图导航到另一个视图,但在尝试使用 IMvxWpfViewsContainer 呈现它时遇到了一些问题。

我已经在我的 App.Xaml.Mvx.cs 中注册了 IMvxWpfViewsContainer 并向其中添加了我的 ViewModel。

private void DoSetup()
{
    LoadMvxAssemblyResources();

    var presenter = new MvxWpfPresenter(MainWindow);

    var setup = new Setup(Dispatcher, presenter);
    setup.Initialize();

    Mvx.RegisterType<IMvxWpfViewsContainer, MvxWpfViewsContainer>();
    var viewContainer = Mvx.Resolve<IMvxWpfViewsContainer>();
    viewContainer.Add<MyViewModel, MyView>(); //Adding my view to the IMvxWpfViewsContainer

    var start = Mvx.Resolve<IMvxAppStart>();
    start.Start();

    _setupComplete = true;
}

在我的 MvxWpfPresenter 中,我从 MvxViewModelRequest.GetDefaultRequest(rootHint.NewRootType) 收到默认请求,但 IMvxWpfViewsContainer 在尝试为我的请求创建视图时在下一行抛出异常。我的主持人是:

public class MvxWpfPresenter : MvxWpfViewPresenter
{
    private readonly Window _mainWindow;

    public MvxWpfPresenter(Window mainWindow)
    {
        _mainWindow = mainWindow;
    }

    public override void Present(FrameworkElement frameworkElement)
    {
        (_mainWindow.Content as Grid).Children.Clear();
        (_mainWindow.Content as Grid).Children.Add(frameworkElement);
    }

    public override void ChangePresentation(Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
    {
        if (hint is MvxRootPresentationHint)
        {
            var rootHint = hint as MvxRootPresentationHint;
            var requestTranslator = Mvx.Resolve<IMvxWpfViewsContainer>();
            var view = MvxViewModelRequest.GetDefaultRequest(rootHint.NewRootType);
            Present(requestTranslator.CreateView(view));
        }
        else
        {
            base.ChangePresentation(hint);
        }
    }

抛出的异常是:

An exception of type 'System.Collections.Generic.KeyNotFoundException' occurred in Cirrious.MvvmCross.dll but was not handled in user code

Additional information: Could not find view for MySolution.Core.ViewModels.MyViewModel

我是注册错了还是忘记了什么?

堆栈是:

at Cirrious.MvvmCross.Views.MvxViewsContainer.GetViewType(Type viewModelType)
at Cirrious.MvvmCross.Wpf.Views.MvxWpfViewsContainer.CreateView(MvxViewModelRequest request)
at MySolution.MvxWpfPresenter.ChangePresentation(MvxPresentationHint hint) in **MYPATH**\MvxWpfPresenter.cs:line 32
at Cirrious.MvvmCross.Wpf.Views.MvxWpfViewDispatcher.<>c__DisplayClass4.<ChangePresentation>b__3()
at Cirrious.CrossCore.Core.MvxMainThreadDispatcher.ExceptionMaskedAction(Action action)

我能够在我的代码中找到问题。我会 post 在这里给出答案,以防有人遇到同样的问题。

当我注册 IMvxWpfViewsContainer 时,我只是在注册它。相反,我不得不将其注册为单身人士。

所以解决方案是修改代码自:

Mvx.RegisterType<IMvxWpfViewsContainer, MvxWpfViewsContainer>();

收件人:

Mvx.RegisterSingleton<IMvxWpfViewsContainer>(() => new MvxWpfViewsContainer());