用户将我指向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
进行通信。
当前,当我构建时,我的应用程序按预期工作。
当我将constructor
从public MainGridTemplate()
修改为public MainGridTemplate(IEventAggregator ea)
并运行应用程序时,没有进行任何其他代码更改(甚至没有保存到本地变量),都会收到错误消息
System.NullReferenceException:'对象引用未设置为对象的实例。'
我的调用栈只显示1个条目,[External Code]
,而构造函数上的断点从未命中。这使我相信被注入的IEventAggregator
为空,或者在注入路径上为空。
在我的视图模型中,同时注入IEventAggregator
和IRepository
服务,并且这些服务都没有问题,所以为什么在usercontrol
中使用DI时为什么会出现此错误>
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>();
是静态的(不是真的...)