diff --git a/src/ReactiveUI.sln b/src/ReactiveUI.sln index e60b06e689..798b14945c 100644 --- a/src/ReactiveUI.sln +++ b/src/ReactiveUI.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# 17 +# Visual Studio Version 17 VisualStudioVersion = 17.0.31825.309 MinimumVisualStudioVersion = 16.0.31613.86 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BD9762CF-E104-481C-96A6-26E624B86283}" diff --git a/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs b/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs index 198a27c62f..33d7ff5c5e 100644 --- a/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs +++ b/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs @@ -3,7 +3,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for full license information. +using System; using System.Globalization; +using System.Reflection; namespace ReactiveUI; @@ -223,8 +225,10 @@ public IDisposable BindTo( Expression viewExpression) where TTarget : class { - var defaultSetter = Reflection.GetValueSetterOrThrow(viewExpression.GetMemberInfo()); - var defaultGetter = Reflection.GetValueFetcherOrThrow(viewExpression.GetMemberInfo()); + var memberInfo = viewExpression.GetMemberInfo(); + + var defaultSetter = Reflection.GetValueSetterOrThrow(memberInfo); + var defaultGetter = Reflection.GetValueFetcherOrThrow(memberInfo); object? SetThenGet(object? paramTarget, object? paramValue, object?[]? paramParams) { @@ -265,7 +269,17 @@ public IDisposable BindTo( })!; } - return (setObservable.Subscribe(_ => { }, ex => this.Log().Error(ex, $"{viewExpression} Binding received an Exception!")), setObservable); + return (setObservable.Subscribe(_ => { }, ex => + { + this.Log().Error(ex, $"{viewExpression} Binding received an Exception!"); + if (ex.InnerException is null) + { + return; + } + + // If the exception is not null, we throw it wrapped in a TargetInvocationException. + throw new TargetInvocationException($"{viewExpression} Binding received an Exception!", ex.InnerException); + }), setObservable); } private bool EvalBindingHooks(TViewModel? viewModel, TView view, Expression vmExpression, Expression viewExpression, BindingDirection direction) @@ -275,15 +289,15 @@ private bool EvalBindingHooks(TViewModel? viewModel, TView vi view.ArgumentNullExceptionThrowIfNull(nameof(view)); Func[]> vmFetcher = vmExpression is not null - ? (() => - { - Reflection.TryGetAllValuesForPropertyChain(out var fetchedValues, viewModel, vmExpression.GetExpressionChain()); - return fetchedValues; - }) - : (() => new IObservedChange[] - { - new ObservedChange(null!, null, viewModel) - }); + ? (() => + { + Reflection.TryGetAllValuesForPropertyChain(out var fetchedValues, viewModel, vmExpression.GetExpressionChain()); + return fetchedValues; + }) + : (() => new IObservedChange[] + { + new ObservedChange(null!, null, viewModel) + }); var vFetcher = new Func[]>(() => {