diff --git a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs index e8df013d50..3f529c11cb 100644 --- a/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs +++ b/src/Markup/Perspex.Markup/Data/ExpressionObserver.cs @@ -204,6 +204,10 @@ namespace Perspex.Markup.Data subscription.Dispose(); }); } + else if (_rootObservable != null) + { + return _rootObservable.Subscribe(observer); + } else { if (_empty == null) diff --git a/tests/Perspex.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs b/tests/Perspex.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs index bde7297d47..c47d53d0a3 100644 --- a/tests/Perspex.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs +++ b/tests/Perspex.Markup.Xaml.UnitTests/Data/BindingTests_ElementName.cs @@ -10,7 +10,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data public class BindingTests_ElementName { [Fact] - public void Should_Bind_To_Element() + public void Should_Bind_To_Element_Path() { TextBlock target; var root = new TestRoot @@ -44,7 +44,42 @@ namespace Perspex.Markup.Xaml.UnitTests.Data } [Fact] - public void Should_Bind_To_Later_Added_Element() + public void Should_Bind_To_Element() + { + TextBlock source; + ContentControl target; + + var root = new TestRoot + { + Child = new StackPanel + { + Children = new Controls.Controls + { + (source = new TextBlock + { + Name = "source", + Text = "foo", + }), + (target = new ContentControl + { + Name = "target", + }) + } + } + }; + + var binding = new Binding + { + ElementName = "source", + }; + + binding.Bind(target, ContentControl.ContentProperty); + + Assert.Same(source, target.Content); + } + + [Fact] + public void Should_Bind_To_Later_Added_Element_Path() { TextBlock target; StackPanel stackPanel; @@ -79,5 +114,43 @@ namespace Perspex.Markup.Xaml.UnitTests.Data Assert.Equal("foo", target.Text); } + + [Fact] + public void Should_Bind_To_Later_Added_Element() + { + ContentControl target; + StackPanel stackPanel; + + var root = new TestRoot + { + Child = stackPanel = new StackPanel + { + Children = new Controls.Controls + { + (target = new ContentControl + { + Name = "target", + }), + } + } + }; + + var binding = new Binding + { + ElementName = "source", + }; + + binding.Bind(target, ContentControl.ContentProperty); + + var source = new TextBlock + { + Name = "source", + Text = "foo", + }; + + stackPanel.Children.Add(source); + + Assert.Same(source, target.Content); + } } }