gpt4 book ai didi

C# ReactiveUI UserError 错误处理程序

转载 作者:行者123 更新时间:2023-12-03 08:12:00 25 4
gpt4 key购买 nike

我一直在使用 ReactiveUI 创建 View 模型并将它们绑定(bind)到我的 WPF View 。在这些 View 模型中,我使用 UserError 来包装异常并将它们转发到关联的 View 。

但是,我注意到当抛出 UserError 时,它并不总是最终出现在预期的处理程序中。为了解决这个问题,我使用 UserError.RegisterHandler<MyUserErrorSubclass>(myHandler) 将 UserError 子类化并仅为该子类注册了处理程序。

这似乎有效,但并不能完全解决问题。
我现在有两个相同 View 模型和关联 View 的实例,但是在一个 View 模型中引发的 UserError 最终会出现在错误的 View 中。这是一个问题,因为我想显示一条错误消息,但它显示在错误的 View 中。

示例代码:

class ViewModel : ReactiveObject {
...
public ReactiveCommand<object> ExampleCommand { get; }

ViewModel(){
...

ExampleCommand.ThrownExceptions.Subscribe(ex => UserError.Throw(new UserError("Error!")));
}
}

class View : IViewFor<ViewModel> {
...
Label exampleLabel;

View(){
...
UserError.RegisterHandler(userError => {
exampleLabel.Text = userError.ErrorMessage;
});
...
}
...
}


ViewModel aModel = new ViewModel();
View aView = new View { ViewModel = aModel};

ViewModel bModel = new ViewModel();
View bView = new View { ViewModel = bModel};

调用 aModel.Example()bView.exampleLabel , 而我需要设置 aView.exampleLabel
解决此问题的最佳方法是什么?

最佳答案

我通过查看 ReactiveUI 源代码弄清楚了。

如果您在无法处理的处理程序中收到 UserError,则应该返回 null。然后将 UserError 传递给下一个注册的处理程序。

示例代码:

UserError.RegisterHandler(userError => {
if(cannotHandleThisError){
return null;
}
exampleLabel.Text = userError.ErrorMessage;
});

我将 UserError 子类化并将抛出的 View 模型存储在 usererror 中。我现在在执行之前检查错误中的 View 模型是否与处理程序 View 模型匹配。

关于C# ReactiveUI UserError 错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39245094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com