2

我很难理解我在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.ThrowSelectMany. 在 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

4

1 回答 1

1

这是ReactiveUI 中的一个旧错误,很久以前就已修复 - 要么升级到 ReactiveUI 4.x,要么将Errors.cs复制到您的项目中并使用它

于 2013-01-20T22:01:08.997 回答