【问题标题】:ReactiveUI 7.0 interaction handler never called从未调用过 ReactiveUI 7.0 交互处理程序
【发布时间】:2017-07-04 21:44:30
【问题描述】:

所以,我正在学习将 ReactiveUI 7.4 与 winforms 一起使用,并且我觉得在我尝试包含 Interactions 以显示错误弹出窗口之前我得到了很好的体验:

视图模型

public class ViewModel : ReactiveObject
{
    [...]

    public ViewModel()
    {
        GetCmd = ReactiveCommand.CreateFromTask(
            _ => myAsyncFunc(),
            CanGetCmd
        );

        GetCmd.ThrownExceptions
              .Subscribe(ex => Interactions.Errors.Handle(ex));   <- breakpoint correctly breaks in there
    }
}

互动

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

基本上在调试中,Handle 声明中的断点命中,但在 RegisterHandler 函数中从未命中。

我可能遗漏了一些东西,因为从interactions 上的 ReactiveUI 文档中,如果我没有设置任何 RegisterHandler(我尝试过),我应该得到一个 UnhandledInteractionException 并且我什至没有得到这个异常......

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

(我也在使用 reactiveui-events-winforms 以获得更好的事件语法连接)

【问题讨论】:

    标签: c# winforms reactiveui interaction


    【解决方案1】:

    Interactions.Errors.Handle(ex) 返回一个冷的 observable,即在你订阅它之前它实际上并没有做任何事情。这应该有效:

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

    (您可能需要添加using System;。)

    【讨论】:

    • 谢谢,就是这样!我还缺少 interaction.SetOutput(Unit.Default); 在我的 RegisterHandler 调用中,所以我告诉我处理了交互。我觉得双订阅语法有点奇怪,有没有更简洁的写法?
    • 这主要取决于情况;如果周围的代码期望返回IObservable&lt;T&gt;,则通常不需要在交互中调用.Subscribe()。例如,您可以将该行重写为GetCmd.ThrownExceptions.SelectMany(ex =&gt; Interactions.Errors.Handle(ex)).Subscribe();SelectMany 在这种情况下只是将异常从 ThrownExceptions observable 传递到 Handle observable,隐式订阅 Handle observable。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多