diff --git a/Perspex.UnitTests/Styling/TestSelectors.cs b/Perspex.UnitTests/Styling/TestSelectors.cs index 74e626120b..389e0531d7 100644 --- a/Perspex.UnitTests/Styling/TestSelectors.cs +++ b/Perspex.UnitTests/Styling/TestSelectors.cs @@ -14,7 +14,7 @@ namespace Perspex.UnitTests.Styling { return new Selector(selector) { - Observable = control => ((TestControlBase)control).SubscribeCheckObservable, + GetObservable = control => ((TestControlBase)control).SubscribeCheckObservable, }; } } diff --git a/Perspex/Styling/Selector.cs b/Perspex/Styling/Selector.cs index 4e3d8f2416..59ddc03f08 100644 --- a/Perspex/Styling/Selector.cs +++ b/Perspex/Styling/Selector.cs @@ -17,29 +17,29 @@ namespace Perspex.Styling { private bool stopTraversal; - private Func> observable; - public Selector() { + this.GetObservable = _ => Observable.Return(true); } public Selector(Selector previous, bool stopTraversal = false) + : this() { this.Previous = previous; + this.InTemplate = previous != null ? previous.InTemplate : false; this.stopTraversal = stopTraversal; } - public Func> Observable + public bool InTemplate { - get - { - return this.observable; - } - - set - { - this.observable = value; - } + get; + set; + } + + public Func> GetObservable + { + get; + set; } public Selector Previous @@ -66,9 +66,14 @@ namespace Perspex.Styling while (selector != null) { - if (selector.Observable != null) + if ((selector.InTemplate && control.TemplatedParent == null) || + (!selector.InTemplate && control.TemplatedParent != null)) + { + inputs.Add(Observable.Return(false)); + } + else { - inputs.Add(selector.Observable(control)); + inputs.Add(selector.GetObservable(control)); } selector = selector.MovePrevious(); diff --git a/Perspex/Styling/Selectors.cs b/Perspex/Styling/Selectors.cs index 8191dec65b..c9f07d5362 100644 --- a/Perspex/Styling/Selectors.cs +++ b/Perspex/Styling/Selectors.cs @@ -20,7 +20,7 @@ namespace Perspex.Styling return new Selector(previous) { - Observable = control => Observable + GetObservable = control => Observable .Return(control.Classes.Contains(name)) .Concat(control.Classes.Changed.Select(e => control.Classes.Contains(name))), SelectorString = (name[0] == ':') ? name : '.' + name, @@ -32,7 +32,7 @@ namespace Perspex.Styling return new Selector(previous, stopTraversal: true) { SelectorString = " ", - Observable = control => + GetObservable = control => { ILogical c = (ILogical)control; List> descendentMatches = new List>(); @@ -43,7 +43,7 @@ namespace Perspex.Styling if (c is IStyleable) { - descendentMatches.Add(previous.Observable((IStyleable)c)); + descendentMatches.Add(previous.GetObservable((IStyleable)c)); } } @@ -58,7 +58,7 @@ namespace Perspex.Styling return new Selector(previous) { - Observable = control => Observable.Return(control.Id == id), + GetObservable = control => Observable.Return(control.Id == id), SelectorString = '#' + id, }; } @@ -69,7 +69,7 @@ namespace Perspex.Styling return new Selector(previous) { - Observable = control => Observable.Return(control is T), + GetObservable = control => Observable.Return(control is T), SelectorString = typeof(T).Name, }; } @@ -78,9 +78,16 @@ namespace Perspex.Styling { Contract.Requires(previous != null); - return new Selector(previous) + return new Selector(previous, stopTraversal: true) { - Observable = control => Observable.Return(control.TemplatedParent != null), + GetObservable = control => + { + IStyleable templatedParent = control.TemplatedParent as IStyleable; + return templatedParent != null ? + previous.GetObservable(templatedParent) : + Observable.Return(true); + }, + InTemplate = true, SelectorString = " $ ", }; }