ViewModels中的Caliburn.Micro EventAggregator未由CM实例化

时间:2014-12-02 20:03:42

标签: wpf mvvm caliburn.micro

在我的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;

    }
}

2 个答案:

答案 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;