C# 从未调用ReactiveUI 7.0交互处理程序
因此,我正在学习将ReactiveUI 7.4与winforms结合使用,我想我在使用它时获得了相当好的体验,直到我尝试包含用于显示错误弹出窗口的交互: 视图模型 相互作用 看法 基本上在调试中,断点在句柄声明中命中,但在RegisterHandler函数中从未命中 我可能遗漏了一些东西,因为从上的ReactiveUI文档中,如果我没有设置任何我尝试过的RegisterHandler,我应该会得到一个未处理的InteractionException,而我甚至没有得到这个异常 如果给定的交互没有处理程序,或者没有任何处理程序设置结果,则交互本身被视为未处理。在这种情况下,句柄的调用将导致抛出未处理的InteractionException 我还使用reactiveui events winforms以获得更好的事件语法连接Interactions.Errors.Handleex返回一个冷的可观察对象,也就是说,在您订阅它之前,它实际上不会做任何事情。这应该起作用:C# 从未调用ReactiveUI 7.0交互处理程序,c#,winforms,reactiveui,interaction,C#,Winforms,Reactiveui,Interaction,因此,我正在学习将ReactiveUI 7.4与winforms结合使用,我想我在使用它时获得了相当好的体验,直到我尝试包含用于显示错误弹出窗口的交互: 视图模型 相互作用 看法 基本上在调试中,断点在句柄声明中命中,但在RegisterHandler函数中从未命中 我可能遗漏了一些东西,因为从上的ReactiveUI文档中,如果我没有设置任何我尝试过的RegisterHandler,我应该会得到一个未处理的InteractionException,而我甚至没有得到这个异常 如果给定的交互没有处
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());