View中的依赖注入会引发system.nullreferenceexception

时间:2018-07-10 15:41:29

标签: c# wpf dependency-injection prism nullreferenceexception

用户将我指向Unity Dependency Injection from usercontrol viewmodel to customUsercontrol Viewmodel

最高答案为Don't use DI/IoC container to inject controls

如果我不应该做的事情,至少建议我应该做的事情。

我需要我的2 ViewModel知道何时选中/取消选中了网格对象以及它是哪个对象。

如果没有IEventAggregator怎么办?


我有一个usercontrol用作GridViewRow模板。在用户搜索某些内容并且我的网格显示对象之前,不会加载此usercontrol

在模板上,有多个复选框,选中后,我需要与viewmodel进行通信。

当前,当我构建时,我的应用程序按预期工作。

当我将constructorpublic MainGridTemplate()修改为public MainGridTemplate(IEventAggregator ea)并运行应用程序时,没有进行任何其他代码更改(甚至没有保存到本地变量),都会收到错误消息

  

System.NullReferenceException:'对象引用未设置为对象的实例。'

我的调用栈只显示1个条目,[External Code],而构造函数上的断点从未命中。这使我相信被注入的IEventAggregator为空,或者在注入路径上为空。

在我的视图模型中,同时注入IEventAggregatorIRepository服务,并且这些服务都没有问题,所以为什么在usercontrol中使用DI时为什么会出现此错误

enter image description here

    public MainGridTemplate()
    {
        InitializeComponent();

        PromoFromDateTextBox.DropDownOpened += HandleClicks;
        PromoToDateTextBox.DropDownOpened += HandleClicks;

        PromoNumberTextBox.GotFocus += HandleClicks;
        PromoPriceTextBox.GotFocus += HandleClicks;

        AdsCheck.Click += HandleClicks;
        DistroCheck.Click += HandleClicks;
        ShowCheck.Click += HandleClicks;
        KeepCheck.Click += HandleClicks;
    }

我的模板在xaml中应用于以下内容

        <ControlTemplate x:Key="PMSMainRowTemplate"
                         TargetType="telerik:GridViewRow">
            <template:MainGridTemplate DataContext="{Binding}" />
        </ControlTemplate>
        <Style TargetType="telerik:GridViewRow"
               BasedOn="{StaticResource GridViewRowStyle}">
            <Setter Property="Template"
                    Value="{StaticResource PMSMainRowTemplate}" />
        </Style>

我当前的解决方法:

在我的bootstrapper类中,IVE添加了属性StaticContainer

public static IUnityContainer StaticContainer {get; set; }

并在我的用户控件中

var container = Bootstrapper.StaticContainer;
_ea = container.Resolve<IEventAggregator>();

是静态的(不是真的...)

0 个答案:

没有答案