C# 从未调用ReactiveUI 7.0交互处理程序

C# 从未调用ReactiveUI 7.0交互处理程序,c#,winforms,reactiveui,interaction,C#,Winforms,Reactiveui,Interaction,因此,我正在学习将ReactiveUI 7.4与winforms结合使用,我想我在使用它时获得了相当好的体验,直到我尝试包含用于显示错误弹出窗口的交互: 视图模型 相互作用 看法 基本上在调试中,断点在句柄声明中命中,但在RegisterHandler函数中从未命中 我可能遗漏了一些东西,因为从上的ReactiveUI文档中,如果我没有设置任何我尝试过的RegisterHandler,我应该会得到一个未处理的InteractionException,而我甚至没有得到这个异常 如果给定的交互没有处

因此,我正在学习将ReactiveUI 7.4与winforms结合使用,我想我在使用它时获得了相当好的体验,直到我尝试包含用于显示错误弹出窗口的交互:

视图模型

相互作用

看法

基本上在调试中,断点在句柄声明中命中,但在RegisterHandler函数中从未命中

我可能遗漏了一些东西,因为从上的ReactiveUI文档中,如果我没有设置任何我尝试过的RegisterHandler,我应该会得到一个未处理的InteractionException,而我甚至没有得到这个异常

如果给定的交互没有处理程序,或者没有任何处理程序设置结果,则交互本身被视为未处理。在这种情况下,句柄的调用将导致抛出未处理的InteractionException

我还使用reactiveui events winforms以获得更好的事件语法连接Interactions.Errors.Handleex返回一个冷的可观察对象,也就是说,在您订阅它之前,它实际上不会做任何事情。这应该起作用:

GetCmd.ThrownExceptions
          .Subscribe(ex => Interactions.Errors.Handle(ex).Subscribe());

您可能需要使用System;添加

谢谢,就这样!我还缺少interaction.SetOutputUnit.Default;在我的RegisterHandler通话中,我告诉他我处理了互动。我觉得双订阅语法有点奇怪,有没有更干净的方法来编写它?这主要取决于情况;如果周围的代码期望返回一个IObservable,那么通常不需要在交互中调用.Subscribe。例如,您可以将该行重写为GetCmd.ThrownExceptions.SelectManyex=>Interactions.Errors.Handleex.Subscribe;。在这种情况下,只需将ThrownExceptions可见的异常通过管道传递到Handle可见,隐式订阅Handle可见。
public static class Interactions
{
    public static readonly Interaction<Exception, Unit> Errors = new Interaction<Exception, Unit>();
}
public ViewCtor()
{
    [viewmodel declaration...]

    this.btnGet.Events().Click
        .Select(_ => Unit.Default)
        .InvokeCommand(this, x => x.ViewModel.GetCmd);

    Interactions.Errors.RegisterHandler(interaction => 
    {
        _popupManager.Show(interaction.Input.Message, "Arf !");   <- but breakpoint never hits here :(
    });
}
GetCmd.ThrownExceptions
          .Subscribe(ex => Interactions.Errors.Handle(ex).Subscribe());