首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caliburn.Micro EventAggregator

Caliburn.Micro EventAggregator
EN

Stack Overflow用户
提问于 2014-01-24 22:53:33
回答 2查看 5.6K关注 0票数 3

如果这是一个非常愚蠢的问题,我很抱歉,但我刚刚开始使用caliburn.micro,我正在努力获得eventAggregator,似乎没有什么订阅……

我不确定问题出在视图模型还是引导程序上。这是视图模型:

代码语言:javascript
复制
class MainWindowViewModel : Screen
{
    private readonly IEventAggregator _eventAggregator;

    public MainWindowViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.Subscribe(this);
    }

    public void SayHello()
    {
        _eventAggregator.Publish("Hello World!");
    }

    public void Handle(string message)
    {
        MessageBox.Show(message);
    }
}

引导程序:

代码语言:javascript
复制
class AppBootstrapper : Bootstrapper<MainWindowViewModel>
{
      public static readonly Container ContainerInstance = new Container();

    protected override void Configure()
    {
        ContainerInstance.Register<IWindowManager, WindowManager>();
        ContainerInstance.RegisterSingle<IEventAggregator,EventAggregator>();
        ContainerInstance.Register<MainWindowViewModel, MainWindowViewModel>();

        ContainerInstance.Verify();
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return ContainerInstance.GetAllInstances(service);
    }

    protected override object GetInstance(System.Type service, string key)
    {
        return ContainerInstance.GetInstance(service);
    }

     protected override void BuildUp(object instance)
    {
        ContainerInstance.InjectProperties(instance);
    }
}

任何想法我错过了什么,我觉得我一定没有链接到某个地方...

我使用SimpleInjector作为IOC容器

编辑:

这似乎是一个非常简单的例子,我不知道我在做什么。RTFM。

实现IHandle是可行的。但它似乎在第一次处理该类型时被调用了两次。我会做一些调查来找出原因。

EN

回答 2

Stack Overflow用户

发布于 2014-01-25 07:50:08

听起来你已经找到了某种解决方案。

我相信只要您使用与您正在发布的兼容的类型实现一个IHandle<T>接口,它就应该可以工作。例如:

代码语言:javascript
复制
class MainWindowViewModel : Screen, IHandle<string>
{ 
    //... Your Code

    public void Handle(string myEventstring)
    {
        // Do Something.
    }
}

如果有帮助的话,当我使用EventAggregator时,我倾向于创建一个静态EventAggregator实例(从一个小的助手类),我在任何需要它的ViewModels中使用它-它可能会在你实际上意外地多次初始化EventAggregator的情况下(可能是双重事件的原因)提供帮助。

我有时也会创建一些小的辅助类来包装事件信息。例如:

代码语言:javascript
复制
public sealed class DownloadFinishedEvent
{
    public readonly string EventText = "Download Completed";

    // Additional Download Info Here.

    public override string ToString()
    {
        return this.EventText;
    }
}
票数 6
EN

Stack Overflow用户

发布于 2014-01-24 22:58:56

caliburn微文档示例表明,订阅者必须实现IHandle接口。我认为这就是问题所在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21335663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档