我很难理解我在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 本身设置的。但是,我在我的应用程序的 OnStartup 事件处理程序中使用这个扳手进入整个过程:
RxApp.GetFieldNameForPropertyNameFunc = prop => prop.Length == 1 ? prop.ToLower() : char.ToLower(prop[0]) + prop.Substring(1);
基本上,我希望我的支持字段以小写字母开头,而不是下划线/大写字母。到目前为止,RxUI 已经兑现了这一点,直到我尝试使用 UserError。我错过了一步还是这是 RxUI 中的错误?
这适用于反应式 UI 3.2.0