我无法理解我在UserError
课上做错了什么。
这是我的ViewModel中的代码:
this.CheckForUpdateCmd = new ReactiveAsyncCommand(Observable.Return(true));
UserError.RegisterHandler(
uerror =>
{
logger.Error(uerror.ErrorMessage, uerror.InnerException);
if (dlgService.ShowMessageBox(
this,
uerror.ErrorMessage,
ClientStrings.AboutVM_ErrorCheckUpdates,
MessageBoxButton.YesNo,
MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
return Observable.
Return(RecoveryOptionResult.RetryOperation);
}
return Observable.
Return(RecoveryOptionResult.FailOperation);
});
this.
CheckForUpdateCmd.
ThrownExceptions.
SelectMany(ex =>
UserError.Throw(
ClientStrings.AboutVM_ErrorCheckUpdates,
ex)).
Subscribe(
recoverOption =>
{
if (recoverOption == RecoveryOptionResult.RetryOperation)
{
this.CheckForUpdateCmd.Execute(null);
}
});
((ReactiveAsyncCommand)this.CheckForUpdateCmd).
RegisterAsyncAction(_ =>
{
throw new Exception("TESTING 123");
});
异步操作中抛出异常后,它会正确传播到Usererror.Throw
内的SelectMany
。在Throw方法内部,RxUI抛出一个ArgumentException:“你必须为这个名为:recoveryOptions的属性声明一个支持字段”
我对此进行了调查,并且UserError类有一个_RecoveryOptions
,它是从UserError本身设置的。但是,在我的App的OnStartup事件处理程序中,我正在用一个扳手进入整个过程:
RxApp.GetFieldNameForPropertyNameFunc = prop => prop.Length == 1 ? prop.ToLower() : char.ToLower(prop[0]) + prop.Substring(1);
基本上,我希望我的支持字段以小写字母开头,而不是下划线/上限。到目前为止,RxUI一直很尊重这一点,直到我尝试使用UserError。我错过了一步还是这是RxUI中的错误?
这适用于Reactive UI 3.2.0