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.Throw例外が非同期アクション内でスローされた後、それは私の内部に正しく伝播されSelectManyます。Throwメソッド内で、RxUIは次の引数例外をスローします:「recoveryOptionsという名前のこのプロパティのバッキングフィールドを宣言する必要があります」

私はこれを調査しましたが、UserErrorクラスには_RecoveryOptionsUserError自体から設定されているがあります。ただし、アプリのOnStartupイベントハンドラー内でこれを使用して、プロセス全体にレンチを投入しています。

RxApp.GetFieldNameForPropertyNameFunc = prop => prop.Length == 1 ? prop.ToLower() : char.ToLower(prop[0]) + prop.Substring(1);

基本的に、バッキングフィールドはアンダースコア/アッパーではなく小文字で始めたいと思います。これまでのところ、UserErrorを使おうとするまで、RxUIはこれを尊重してきました。ステップがありませんか、それともRxUIのバグですか?

これはリアクティブUI3.2.0用です

4

1 に答える 1

1

これは、かなり前に修正された ReactiveUI の古いバグです。ReactiveUI 4.x にアップグレードするか、Errors.csをプロジェクトにコピーして使用します。

于 2013-01-20T22:01:08.997 に答える