使用Caliburn.Micro在视图模型中冒泡

时间:2014-10-31 16:47:40

标签: c# wpf mvvm caliburn.micro

我有一个带有搜索字段的屏幕视图模型和一些结果,由多个较小的视图模型组成:搜索字段的控件和每个结果的控件实例。

我的"容器" viewmodel(带有搜索和结果)如下所示:

[Export(typeof(ShippingViewModel))]
public class ShippingViewModel : Screen, IHandle<SearchReferenceEvent>
{
    private readonly IEventAggregator events;

    [ImportingConstructor]
    public ShippingViewModel(IEventAggregator events)
    {
        this.events = events;

        this.Search = new QuickSearchViewModel(this.events);
    }

    public QuickSearchViewModel Search { get; set; }

    public void Handle(SearchReferenceEvent message)
    {
        System.Windows.MessageBox.Show(message.Reference);
    }
}

&#34;快速搜索&#34; (使用搜索字段)viewmodel:

[Export(typeof(QuickSearchViewModel))]
public class QuickSearchViewModel : PropertyChangedBase
{
    private readonly IEventAggregator events;

    private string currentSearch;

    [ImportingConstructor]
    public QuickSearchViewModel(IEventAggregator events)
    {
        this.events = events;
    }

    public string CurrentSearch // bound to the search field
    {
        get
        {
            return this.currentSearch;
        }

        set
        {
            this.currentSearch = value;
            this.NotifyOfPropertyChange(() => this.CurrentSearch);
        }
    }

    public void SearchReference(string reference) // bound to the search button
    {
        this.events.Publish(new SearchReferenceEvent(reference));
    }
}

视图按预期显示,搜索按钮触发SearchReference方法。

但事件似乎没有冒出ShippingViewModelHandle永远不会被触发。

谢谢!

1 个答案:

答案 0 :(得分:1)

您似乎永远不会订阅ShippingViewModel中的活动。尝试修改你的构造函数:

[ImportingConstructor]
public ShippingViewModel(IEventAggregator events)
{
    this.events = events;
    this.events.Subscribe(this); // <= register to receive events

    this.Search = new QuickSearchViewModel(this.events);
}