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)); } }; }