From 1e8087790c154abf43da803a235951bd3d1b2d73 Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Sat, 25 Apr 2020 18:26:05 +1000 Subject: [PATCH] fix: Fix android crashing on text binding --- .../Property/PropertyBinderImplementation.cs | 17 ++++++++++------- .../android/AndroidObservableForWidgets.cs | 10 +++++++--- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs b/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs index 67099bfcf1..4a5ac1e148 100644 --- a/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs +++ b/src/ReactiveUI/Bindings/Property/PropertyBinderImplementation.cs @@ -596,30 +596,30 @@ private bool EvalBindingHooks(TViewModel viewModel, TView vie signalInitialUpdate.Select(_ => true), signalObservable); - var changeWithValues = somethingChanged.Select(isVm => + var changeWithValues = somethingChanged.Select(isVm => { if (!Reflection.TryGetValueForPropertyChain(out TVMProp vmValue, view.ViewModel, vmExpression.GetExpressionChain()) || !Reflection.TryGetValueForPropertyChain(out TVProp vValue, view, viewExpression.GetExpressionChain())) { - return null; + return (false, null, false); } if (isVm) { if (!vmToViewConverter(vmValue, out TVProp vmAsView) || EqualityComparer.Default.Equals(vValue, vmAsView)) { - return null; + return (false, null, false); } - return Tuple.Create((object)vmAsView, isVm); + return (true, (object)vmAsView, isVm); } if (!viewToVmConverter(vValue, out TVMProp vAsViewModel) || EqualityComparer.Default.Equals(vmValue, vAsViewModel)) { - return null; + return (false, null, false); } - return Tuple.Create((object)vAsViewModel, isVm); + return (true, (object)vAsViewModel, isVm); }); var ret = EvalBindingHooks(viewModel, view, vmExpression, viewExpression, BindingDirection.TwoWay); @@ -628,7 +628,10 @@ private bool EvalBindingHooks(TViewModel viewModel, TView vie return null; } - IObservable<(object view, bool isViewModel)> changes = changeWithValues.Where(value => value != null).Select(value => (value.Item1, value.Item2)).Publish().RefCount(); + IObservable<(object view, bool isViewModel)> changes = changeWithValues + .Where(value => value.isValid) + .Select(value => (value.view, value.isViewModel)) + .Publish().RefCount(); IDisposable disposable = changes.Subscribe(isVmWithLatestValue => { diff --git a/src/ReactiveUI/Platforms/android/AndroidObservableForWidgets.cs b/src/ReactiveUI/Platforms/android/AndroidObservableForWidgets.cs index 16e59faa33..d0742329ce 100644 --- a/src/ReactiveUI/Platforms/android/AndroidObservableForWidgets.cs +++ b/src/ReactiveUI/Platforms/android/AndroidObservableForWidgets.cs @@ -142,10 +142,14 @@ private static DispatchItem CreateFromWidget(Expression, TEventArgs>( + return Observable.FromEvent, ObservedChange>( + eventHandler => + { + void Handler(object sender, TEventArgs e) => eventHandler(new ObservedChange(view, ex)); + return Handler; + }, h => addHandler(view, h), - h => removeHandler(view, h)) - .Select(_ => new ObservedChange(view, ex)); + h => removeHandler(view, h)); } }; }