C#ReactiveUI UserError错误处理程序

时间:2016-08-31 08:57:37

标签: c# error-handling reactiveui

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

但是,我注意到当抛出UserError时,它并不总是在预期的处理程序中结束。为了解决这个问题,我使用UserError.RegisterHandler<MyUserErrorSubclass>(myHandler)

仅为此子类子类化了UserError和注册处理程序

这似乎有效,但并未完全解决问题。 我现在有两个相同viewmodel和关联视图的实例,但是在一个viewmodel中抛出的UserError最终会出现在错误的视图中。这是一个问题,因为我想显示一条错误消息,但它显示在错误的视图中。

示例代码:

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

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我通过查看ReactiveUI源代码来解决这个问题。

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

示例代码:

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

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