Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#ReactiveUI用户错误处理程序错误_C#_Error Handling_Reactiveui - Fatal编程技术网

C#ReactiveUI用户错误处理程序错误

C#ReactiveUI用户错误处理程序错误,c#,error-handling,reactiveui,C#,Error Handling,Reactiveui,我一直在使用ReactiveUI创建视图模型,并将它们绑定到我的WPF视图。在这些视图模型中,我使用UserError包装异常并将它们转发到关联的视图 但是,我注意到,当抛出UserError时,它并不总是在预期的处理程序中结束。为了解决这个问题,我使用UserError.RegisterHandler(myHandler) 这似乎可行,但不能完全解决问题。 我现在有两个相同viewmodel和关联视图的实例,但是在一个viewmodel中抛出的UserError最终出现在错误的视图中。这是一个

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

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

这似乎可行,但不能完全解决问题。 我现在有两个相同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};
UserError.RegisterHandler(userError => {
    if(cannotHandleThisError){
        return null;
    }
    exampleLabel.Text = userError.ErrorMessage;
});
class-ViewModel:ReactiveObject{
...
公共反应命令示例命令{get;}
ViewModel(){
...
例如command.ThrownExceptions.Subscribe(ex=>UserError.Throw(newusererror(“Error!”));
}
}
类视图:IViewFor{
...
标签示例标签;
视图(){
...
RegisterHandler(UserError=>{
exampleLabel.Text=userError.ErrorMessage;
});
...
}
...
}
ViewModel aModel=新ViewModel();
视图aView=新视图{ViewModel=aModel};
ViewModel bModel=新的ViewModel();
视图bView=新视图{ViewModel=bModel};
调用
aModel.Example()
设置
bView.exampleLabel
,而我需要设置
aView.exampleLabel


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

我通过查看ReactiveUI源代码找到了答案

如果在处理程序中接收到无法处理的UserError,则应返回null。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};
UserError.RegisterHandler(userError => {
    if(cannotHandleThisError){
        return null;
    }
    exampleLabel.Text = userError.ErrorMessage;
});

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

我通过查看ReactiveUI源代码找到了它

如果在处理程序中接收到无法处理的UserError,则应返回null。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};
UserError.RegisterHandler(userError => {
    if(cannotHandleThisError){
        return null;
    }
    exampleLabel.Text = userError.ErrorMessage;
});
我将UserError子类化,并将抛出的viewmodel存储在UserError中。在执行之前,我现在检查错误中的viewmodel是否与处理程序viewmodel匹配