public async void Track_By_Name_Should_Find_Control_Added_Earlier() { TextBlock target; TextBlock relativeTo; var root = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (target = new TextBlock { Name = "target" }), (relativeTo = new TextBlock { Name = "start" }), } } }; var locator = ControlLocator.Track(relativeTo, "target"); var result = await locator.Take(1); Assert.Same(target, result); Assert.Equal(0, root.NameScopeRegisteredSubscribers); Assert.Equal(0, root.NameScopeUnregisteredSubscribers); }
private ExpressionObserver CreateFindAncestorObserver( IStyledElement target, RelativeSource relativeSource, string path, bool enableDataValidation) { Contract.Requires <ArgumentNullException>(target != null); IObservable <object> controlLocator; switch (relativeSource.Tree) { case TreeType.Logical: controlLocator = ControlLocator.Track( (ILogical)target, relativeSource.AncestorLevel - 1, relativeSource.AncestorType); break; case TreeType.Visual: controlLocator = VisualLocator.Track( (IVisual)target, relativeSource.AncestorLevel - 1, relativeSource.AncestorType); break; default: throw new InvalidOperationException("Invalid tree to traverse."); } return(new ExpressionObserver( controlLocator, path, enableDataValidation)); }
public void Track_By_Name_Should_Find_Control_Added_Later() { StackPanel panel; TextBlock relativeTo; var root = new TestRoot { Child = (panel = new StackPanel { Children = new Controls.Controls { (relativeTo = new TextBlock { Name = "start" }), } }) }; var locator = ControlLocator.Track(relativeTo, "target"); var target = new TextBlock { Name = "target" }; var result = new List <IControl>(); using (locator.Subscribe(x => result.Add(x))) { panel.Children.Add(target); } Assert.Equal(new[] { null, target }, result); Assert.Equal(0, root.NameScopeRegisteredSubscribers); Assert.Equal(0, root.NameScopeUnregisteredSubscribers); }
protected ExpressionObserver CreateFindAncestorObserver( IStyledElement target, RelativeSource relativeSource, ExpressionNode node) { _ = target ?? throw new ArgumentNullException(nameof(target)); IObservable <object?> controlLocator; switch (relativeSource.Tree) { case TreeType.Logical: controlLocator = ControlLocator.Track( (ILogical)target, relativeSource.AncestorLevel - 1, relativeSource.AncestorType); break; case TreeType.Visual: controlLocator = VisualLocator.Track( (IVisual)target, relativeSource.AncestorLevel - 1, relativeSource.AncestorType); break; default: throw new InvalidOperationException("Invalid tree to traverse."); } return(new ExpressionObserver( controlLocator, node, null)); }
private ExpressionObserver CreateElementObserver(IControl target, string elementName, string path) { Contract.Requires <ArgumentNullException>(target != null); var result = new ExpressionObserver( ControlLocator.Track(target, elementName), path); return(result); }
private ExpressionObserver CreateFindAncestorObserver( IControl target, string path) { Contract.Requires <ArgumentNullException>(target != null); return(new ExpressionObserver( ControlLocator.Track(target, RelativeSource.AncestorType, RelativeSource.AncestorLevel - 1), path)); }
protected override void StartListeningCore(WeakReference reference) { if (reference.Target is ILogical logical) { _subscription = ControlLocator.Track(logical, _name).Subscribe(ValueChanged); } else { _subscription = null; } }
public void Track_By_Name_Should_Find_Control_When_Tree_Changed() { TextBlock target1; TextBlock target2; TextBlock relativeTo; var root1 = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (relativeTo = new TextBlock { Name = "start" }), (target1 = new TextBlock { Name = "target" }), } } }; var root2 = new TestRoot { Child = new StackPanel { Children = new Controls.Controls { (target2 = new TextBlock { Name = "target" }), } } }; var locator = ControlLocator.Track(relativeTo, "target"); var target = new TextBlock { Name = "target" }; var result = new List <IControl>(); using (locator.Subscribe(x => result.Add(x))) { ((StackPanel)root1.Child).Children.Remove(relativeTo); ((StackPanel)root2.Child).Children.Add(relativeTo); } Assert.Equal(new[] { target1, null, target2 }, result); Assert.Equal(0, root1.NameScopeRegisteredSubscribers); Assert.Equal(0, root1.NameScopeUnregisteredSubscribers); }
private ExpressionObserver CreateFindAncestorObserver( IControl target, RelativeSource relativeSource, string path, bool enableDataValidation) { Contract.Requires <ArgumentNullException>(target != null); return(new ExpressionObserver( ControlLocator.Track(target, relativeSource.Tree, relativeSource.AncestorLevel - 1, relativeSource.AncestorType), path, enableDataValidation)); }
private ExpressionObserver CreateElementObserver( IStyledElement target, string elementName, ExpressionNode node) { Contract.Requires <ArgumentNullException>(target != null); var result = new ExpressionObserver( ControlLocator.Track(target, elementName), node, null); return(result); }
private ExpressionObserver CreateElementObserver( IStyledElement target, string elementName, string path, bool enableDataValidation) { Contract.Requires <ArgumentNullException>(target != null); var description = $"#{elementName}.{path}"; var result = new ExpressionObserver( ControlLocator.Track(target, elementName), path, enableDataValidation, description); return(result); }
public void Track_By_Name_Should_Track_Removal_And_Readd() { StackPanel panel; TextBlock target; TextBlock relativeTo; var root = new TestRoot { Child = panel = new StackPanel { Children = new Controls.Controls { (target = new TextBlock { Name = "target" }), (relativeTo = new TextBlock { Name = "start" }), } } }; var locator = ControlLocator.Track(relativeTo, "target"); var result = new List <IControl>(); locator.Subscribe(x => result.Add(x)); var other = new TextBlock { Name = "target" }; panel.Children.Remove(target); panel.Children.Add(other); Assert.Equal(new[] { target, null, other }, result); }
protected override void Subscribed() { _ownerSubscription = ControlLocator.Track(_item, 0, typeof(TabControl)).Subscribe(OwnerChanged); }
protected override void StartListeningCore(WeakReference <object> reference) { if (reference.TryGetTarget(out object target) && target is ILogical logical) { _subscription = ControlLocator.Track(logical, _level, _ancestorType).Subscribe(ValueChanged); }