Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions ReactiveUI/PropertyBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -656,7 +656,7 @@ public IReactiveBinding<TView, TViewModel, Tuple<object, bool>> Bind<TViewModel,
}

var somethingChanged = Observable.Merge(
Reflection.ViewModelWhenAnyValue(viewModel, view, vmProperty).Select(_ => true),
Reflection.ViewModelWhenAnyValueDynamic(viewModel, view, vmPropChain).Select(_ => true),
signalInitialUpdate.Select(_ => true),
signalViewUpdate != null ?
signalViewUpdate.Select(_ => false) :
Expand Down Expand Up @@ -777,7 +777,6 @@ public IReactiveBinding<TView, TViewModel, TVProp> OneWayBind<TViewModel, TView,
{
var vmPropChain = Reflection.ExpressionToPropertyNames(vmProperty);
var viewPropChain = default(string[]);
var vmString = String.Format("{0}.{1}", typeof (TViewModel).Name, String.Join(".", vmPropChain));
var source = default(IObservable<TVProp>);
var fallbackWrapper = default(Func<TVProp>);

Expand All @@ -794,7 +793,7 @@ public IReactiveBinding<TView, TViewModel, TVProp> OneWayBind<TViewModel, TView,
var ret = evalBindingHooks(viewModel, view, vmPropChain, viewPropChain, BindingDirection.OneWay);
if (!ret) return null;

source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmProperty)
source = Reflection.ViewModelWhenAnyValueDynamic(viewModel, view, vmPropChain)
.SelectMany(x => {
object tmp;
if (!converter.TryConvert(x, viewType, conversionHint, out tmp)) return Observable.Empty<TVProp>();
Expand All @@ -817,7 +816,7 @@ public IReactiveBinding<TView, TViewModel, TVProp> OneWayBind<TViewModel, TView,
var ret = evalBindingHooks(viewModel, view, vmPropChain, viewPropChain, BindingDirection.OneWay);
if (!ret) return null;

source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmProperty)
source = Reflection.ViewModelWhenAnyValueDynamic(viewModel, view, vmPropChain)
.SelectMany(x => {
object tmp;
if (!converter.TryConvert(x, typeof(TVProp), conversionHint, out tmp)) return Observable.Empty<TVProp>();
Expand Down Expand Up @@ -894,13 +893,13 @@ public IReactiveBinding<TView, TViewModel, TOut> OneWayBind<TViewModel, TView, T
var ret = evalBindingHooks(viewModel, view, vmPropChain, viewPropChain, BindingDirection.OneWay);
if (!ret) return null;

source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmProperty).Select(selector);
source = Reflection.ViewModelWhenAnyValueDynamic(viewModel, view, vmPropChain).Select(x => (TProp)x).Select(selector);
} else {
viewPropChain = Reflection.ExpressionToPropertyNames(viewProperty);
var ret = evalBindingHooks(viewModel, view, vmPropChain, viewPropChain, BindingDirection.OneWay);
if (!ret) return null;

source = Reflection.ViewModelWhenAnyValue(viewModel, view, vmProperty).Select(selector);
source = Reflection.ViewModelWhenAnyValueDynamic(viewModel, view, vmPropChain).Select(x => (TProp)x).Select(selector);
}

IDisposable disp = bindToDirect(source, view, viewProperty, fallbackValue);
Expand Down
3 changes: 1 addition & 2 deletions ReactiveUI/ReactiveList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@ protected void RemoveItem(int index)
if (ChangeTrackingEnabled) removeItemFromPropertyTracking(item);
}

#if !SILVERLIGHT
protected void MoveItem(int oldIndex, int newIndex)
{
var item = _inner[oldIndex];
Expand All @@ -186,7 +185,7 @@ protected void MoveItem(int oldIndex, int newIndex)
_changed.OnNext(ea);
if (_itemsMoved.IsValueCreated) _itemsMoved.Value.OnNext(mi);
}
#endif

protected void SetItem(int index, T item)
{
if (_suppressionRefCount > 0) {
Expand Down
11 changes: 10 additions & 1 deletion ReactiveUI/Reflection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,16 @@ internal static IObservable<TProp> ViewModelWhenAnyValue<TView, TViewModel, TPro
{
return view.WhenAny(x => x.ViewModel, x => x.Value)
.Where(x => x != null)
.SelectMany(x => ((TViewModel)x).WhenAny(property, y => y.Value));
.SelectMany(x => Reflection.ExpressionToPropertyNames(property).Length == 0 ? Observable.Return((TProp)x) : ((TViewModel)x).WhenAny(property, y => y.Value));
}

internal static IObservable<object> ViewModelWhenAnyValueDynamic<TView, TViewModel>(TViewModel viewModel, TView view, string[] property)
where TView : IViewFor
where TViewModel : class
{
return view.WhenAny(x => x.ViewModel, x => x.Value)
.Where(x => x != null)
.SelectMany(x => property.Length == 0 ? Observable.Return(x) : ((TViewModel)x).WhenAnyDynamic(property, y => y.Value));
}

internal static FieldInfo GetSafeField(Type type, string propertyName, BindingFlags flags)
Expand Down