private ExpressionObserver CreateDataContexObserver( IPerspexObject target, string path, bool targetIsDataContext) { Contract.Requires <ArgumentNullException>(target != null); if (!targetIsDataContext) { var update = target.GetObservable(Control.DataContextProperty) .Skip(1) .Select(_ => Unit.Default); var result = new ExpressionObserver( () => target.GetValue(Control.DataContextProperty), path, update); return(result); } else { return(new ExpressionObserver( target.GetObservable(Visual.VisualParentProperty) .OfType <IPerspexObject>() .Select(x => x.GetObservable(Control.DataContextProperty)) .Switch(), path)); } }
/// <summary> /// Gets an observable for a <see cref="PerspexProperty"/>. /// </summary> /// <param name="o">The object.</param> /// <param name="property">The property.</param> /// <returns>An observable.</returns> public static IObservable <object> GetObservable(this IPerspexObject o, PerspexProperty property) { Contract.Requires <ArgumentNullException>(o != null); Contract.Requires <ArgumentNullException>(property != null); return(new PerspexObservable <object>( observer => { EventHandler <PerspexPropertyChangedEventArgs> handler = (s, e) => { if (e.Property == property) { observer.OnNext(e.NewValue); } }; observer.OnNext(o.GetValue(property)); o.PropertyChanged += handler; return Disposable.Create(() => { o.PropertyChanged -= handler; }); }, GetDescription(o, property))); }
private ExpressionObserver CreateTemplatedParentObserver( IPerspexObject target, string path) { Contract.Requires <ArgumentNullException>(target != null); var update = target.GetObservable(Control.TemplatedParentProperty) .Skip(1) .Select(_ => Unit.Default); var result = new ExpressionObserver( () => target.GetValue(Control.TemplatedParentProperty), path, update); return(result); }
private ExpressionObserver CreateDataContexObserver( IPerspexObject target, string path, bool targetIsDataContext, object anchor) { Contract.Requires <ArgumentNullException>(target != null); if (!(target is IControl)) { target = anchor as IControl; if (target == null) { throw new InvalidOperationException("Cannot find a DataContext to bind to."); } } if (!targetIsDataContext) { var update = target.GetObservable(Control.DataContextProperty) .Skip(1) .Select(_ => Unit.Default); var result = new ExpressionObserver( () => target.GetValue(Control.DataContextProperty), path, update); return(result); } else { return(new ExpressionObserver( target.GetObservable(Visual.VisualParentProperty) .OfType <IPerspexObject>() .Select(x => x.GetObservable(Control.DataContextProperty)) .Switch(), path)); } }
private ExpressionObserver CreateTemplatedParentObserver( IPerspexObject target, string path) { Contract.Requires<ArgumentNullException>(target != null); var update = target.GetObservable(Control.TemplatedParentProperty) .Skip(1) .Select(_ => Unit.Default); var result = new ExpressionObserver( () => target.GetValue(Control.TemplatedParentProperty), path, update); return result; }
private ExpressionObserver CreateDataContexObserver( IPerspexObject target, string path, bool targetIsDataContext) { Contract.Requires<ArgumentNullException>(target != null); if (!targetIsDataContext) { var update = target.GetObservable(Control.DataContextProperty) .Skip(1) .Select(_ => Unit.Default); var result = new ExpressionObserver( () => target.GetValue(Control.DataContextProperty), path, update); return result; } else { return new ExpressionObserver( target.GetObservable(Visual.VisualParentProperty) .OfType<IPerspexObject>() .Select(x => x.GetObservable(Control.DataContextProperty)) .Switch(), path); } }