在我的ShellViewModel中,我得到了以下使用Linq和EntityFramework查询的函数。这里的目标是将POCO转换为ViewModel,并使用CM将生成的ViewModel绑定到ShellView中的ListBox。
以下是代码的部分列表。一切正常。但是,我现在需要每个ItemViewModel能够在某个动作发生时通知ShellViewModel。如何将CM&#39的EventAggregator放入每个ItemViewModel?所有EventAggregator示例都通过ViewModel的Ctor依赖注入来显示这种情况。如何在实例化ViewModels时如何使依赖注入工作,如下面的GetData()所示?
[Export(typeof(ShellViewModel))]
public class ShellViewModel : Conductor<object>, IHandle<UserPasswordChanged>
{
private void GetData()
{
var query = _EfDataContext.Items
.Where(x => (x.CreatedDtm > DayBeginning && x.CreatedDtm <= NowDtm));
//Create a list of ItemViewModels for Caliburn.Micro to Bind
//How can EventAggregator be injected into ItemViewModel when
//creating ViewModels this way?
this.Items = new BindableCollection<ItemViewModel>(query
.Select(x => new ItemViewModel
{
Item = x
}));
}
[ImportingConstructor]
public ShellViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
IsDeveloperMode = false;
}
}
答案 0 :(得分:0)
为什么不直接传递你的EventAggregator呢?
// ...
.Select(x => new ItemViewModel(_eventAggregator)
// ...
因为这些是由已经注入了依赖项的实例显式创建的。
答案 1 :(得分:0)
事实证明问题出在我的Linq声明中。我已经尝试将事件聚合器从ShellViewModel传递给ItemViewModel,因为正如Sven所说,事情已经被注入了。为什么要再次注射?
Items =
new BindableCollection<ItemViewModel>(query
.Select(x => new ItemViewModel
{
Item = x,
EventAggregator = this._eventAggregator
}));
然而,这会导致以下错误: 无法创建“Caliburn.Micro.IEventAggregator”类型的常量值。在此上下文中仅支持原始类型或枚举类型。
我当时没有意识到这不是Mef或CM的问题,而是Linq。以下两步解决方案有效:
Items =
new BindableCollection<ItemViewModel>(query
.Select(x => new ItemViewModel
{
Item = x
}));
foreach (var itemViewModel in Items)
itemViewModel .EventAggregator = this._eventAggregator;