【问题标题】:Caliburn.Micro EventAggregatorCaliburn.Micro 事件聚合器
【发布时间】:2014-01-24 14:53:33
【问题描述】:

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

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

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);
    }
}

引导程序:

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 容器

编辑:

这似乎是一个非常简单的案例,我不知道自己在做什么。实时调频。

实施 IHandle 确实有效。不过,第一次处理该类型时,它似乎被调用了两次。我会调查一下原因。

【问题讨论】:

    标签: c# caliburn.micro eventaggregator


    【解决方案1】:

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

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

    class MainWindowViewModel : Screen, IHandle<string>
    { 
        //... Your Code
    
        public void Handle(string myEventstring)
        {
            // Do Something.
        }
    }
    

    如果有帮助的话,当我使用EventAggregator 时,我倾向于创建一个静态的EventAggregator 实例(来自一个小的帮助器类),我在任何需要它的ViewModels 中使用它——它可能会在某些情况下有所帮助您实际上已经多次初始化 EventAggregator 不小心(可能是您的双重事件的原因)。

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

    public sealed class DownloadFinishedEvent
    {
        public readonly string EventText = "Download Completed";
    
        // Additional Download Info Here.
    
        public override string ToString()
        {
            return this.EventText;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经用 IHandle 接口的 2 个实例尝试了这个。 IHandle 和 IHandle。没有效果。
      • 它确实被调用和断点。虽然我之前确实犯过错误。实现IHandle&lt;string&gt; 确实有效(虽然第一次发布被调用Handle 被调用两次),但是IHandle 什么都不做。
      • 您在使用IHandle nongeneric 时有什么方法签名?我认为它适用于无参数方法。
      猜你喜欢
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多