AutoWireViewModel异常

时间:2016-06-16 20:42:25

标签: c# wpf xaml prism

我正在学习Prism 6.0.0,我遇到了AutoWireViewModel异常的问题。 如果我没有绑定到这个界面,我不知道如何注入IRegionRepository。

另外我正在使用Ninject和实体框架

整个项目在这里:https://github.com/PiotrKowalski93/PrismDemo

我正在学习:https://www.youtube.com/watch?v=ZfBy2nfykqY,他的代码工作正常,但他正在使用Prism 5.7.0

我想要的是在按下按钮后显示我的EmployeesView。

MainWindow.xaml中的我的容器

 <ItemsControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />

在启动应用程序期间抛出异常:

prism:ViewModelLocator.AutoWireViewModel="True"

My Bootstraper.cs

public class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void InitializeShell()
    {
        Application.Current.MainWindow.Show();
    }

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        Container.RegisterTypeForNavigation<EmployeesView>("Employee");            
    }        
}

我的App.xaml.cs文件:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        Bootstrapper bs = new Bootstrapper();
        bs.Run();
    }
}

我的MainWindowViewModel.cs

private readonly IRegionManager _regionManager;

public DelegateCommand<string> NavigateCommand { get; set; }

public MainWindowViewModel(IRegionManager regionManager)
{
   _regionManager = regionManager;

    NavigateCommand = new DelegateCommand<string>(Navigate);
}

private void Navigate(string obj)
{
    _regionManager.RequestNavigate("ContentRegion", obj);
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

如果您查看Prism WPF的supported IoC containers,您会看到我们支持Ninject。为此,您可以使用Prism.Ninject包而不是Prism.Unity。

Packages

下一个逻辑步骤是用NinjectBootstrapper类替换UnityBootstrapper基类。我不熟悉Ninject,所以我不确定你是否必须注册所有类型,或者Ninject是否有办法自动解析未注册的类型。

另一个解决方案是用Unity替换你的Ninject以更接近样本,但这不是问题的一部分:)。 Ninject有官方支持,所以没有什么能阻止你选择熟悉的IoC容器。

额外注意:有些东西可以工作而其他东西不工作的原因是因为一些IoC容器(如Unity)可以在没有配置的情况下解析具体类型的实例,而其他的(如Autofac)允许使用一些额外的配置(如果是Autofac,则为AnyConcreteTypeNotAlreadyRegisteredSource。)

答案 1 :(得分:0)

您应该使用引导程序的Unity容器注册您的服务,而不是从未用于解析的Ninject内核。 Unity不知道IHrService应该解析为HrService ...尝试添加

Container.RegisterType<IHrService, HrService>();

到你的引导程序ConfigureContainer

编辑:此外,请务必从Prism 6中解析正确的IRegionManager,即Prism.Regions.IRegionManager。您的解决方案包含大量旧Prism组件的参考,您的使用包含来自那些的东西(比如Microsoft.Practices.Prism.Regions.IRegionManager ...)

答案 2 :(得分:0)

好的,所以设法搞清楚了:

  1. 我删除了Ninject,我只使用Unity作为我的主要容器。
  2. 我的队员里乱了。我删除了所有

    Microsoft.Practices.Prism

    Microsoft.Practices.Prism.MVVM

  3. 的DLL。

    3.我重新安装了Prism软件包,我的Prism.WPF和Prism.Unity版本是6.x.x版,但我的Prism软件包是在5.x.x上。

    Ovecourse我不得不将我的界面从Ninject模块的类映射移动到Unity模块中的Container Configuration。