2014-12-02 74 views
0

在我的ShellViewModel中,我已经获得了使用Linq和EntityFramework进行查询的以下函数。此处的目标是将POCO转换为ViewModels,并使用CM将生成的ViewModels绑定到ShellView中的ListBox。ViewModels中的Caliburn.Micro EventAggregator未由CM实例化

下面是代码的部分列表。一切正常。不过,我现在正处于需要每个ItemViewModel能够在发生某些操作时通知ShellViewModel的点。我如何将CM的EventAggregator放入每个ItemViewModel?所有EventAggregator示例都通过ViewModel的Ctor通过依赖注入来显示这种情况。当如下面的GetData()所示实例化ViewModels时,如何让依赖注入工作?

[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

为什么不简单地传递你的EventAggregator呢?

// ... 
.Select(x => new ItemViewModel(_eventAggregator) 
// ... 

由于这些是由已经有注入依赖项的实例明确创建的。

+0

感谢您的建议斯文,当我试图与对象初始化语法,我得到以下错误:“无法创建类型的常量值“Caliburn.Micro.IEventAggregator '。在这种情况下,只支持原始类型或枚举类型。“ – Sean 2014-12-03 15:37:45

+0

嗯,我似乎无法重现该错误消息。我尝试了EventAggregator = this._event,就像你在自己的答案中发布的那样,但是工作正常。 EventAggregator是ItemViewModel上的IEventAggregator的属性吗? – Sven 2014-12-03 16:49:12

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; 
+0

你解决了你的问题?它是一种通过在ViewModel本身之外进行分配EventAggregator的奇怪方法..您可以在构造函数中完成例如public ItemViewModel(IEventAggregator eventAggregator){this.EventAggregator = evenAggregator} {this.EventAggregator = evenAggregator}并且您不需要新的ItemViewModel,而是让MVVM处理它 – 2014-12-08 07:43:58

相关问题