具有非默认支持字段命名约定的UserError.Throw

时间:2013-01-17 00:12:03

标签: reactiveui

我无法理解我在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

1 个答案:

答案 0 :(得分:1)

这是很久以前修复的old bug in ReactiveUI - 升级到ReactiveUI 4.x,或者将Errors.cs复制到项目中并使用