diff --git a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs index bd116f3396..776a78d83a 100644 --- a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs +++ b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs @@ -90,7 +90,8 @@ namespace Perspex.Markup.Xaml.Data observer = CreateDataContexObserver( target, pathInfo.Path, - targetProperty == Control.DataContextProperty); + targetProperty == Control.DataContextProperty, + anchor); } else if (RelativeSource.Mode == RelativeSourceMode.TemplatedParent) { @@ -161,10 +162,21 @@ namespace Perspex.Markup.Xaml.Data private ExpressionObserver CreateDataContexObserver( IPerspexObject target, string path, - bool targetIsDataContext) + bool targetIsDataContext, + object anchor) { Contract.Requires(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) diff --git a/tests/Perspex.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs b/tests/Perspex.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs index 5b0da45ac6..4bca335275 100644 --- a/tests/Perspex.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs +++ b/tests/Perspex.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs @@ -30,7 +30,7 @@ namespace Perspex.Markup.Xaml.UnitTests.Data } }; - var target = new Mock(); + var target = new Mock().As(); target.Setup(x => x.GetValue(Control.DataContextProperty)).Returns(source); var subject = binding.Initiate(target.Object, null).Subject; diff --git a/tests/Perspex.Markup.Xaml.UnitTests/Xaml/BindingTests.cs b/tests/Perspex.Markup.Xaml.UnitTests/Xaml/BindingTests.cs index 8777a735aa..0224584cdb 100644 --- a/tests/Perspex.Markup.Xaml.UnitTests/Xaml/BindingTests.cs +++ b/tests/Perspex.Markup.Xaml.UnitTests/Xaml/BindingTests.cs @@ -80,6 +80,31 @@ namespace Perspex.Markup.Xaml.UnitTests.Xaml } } + [Fact] + public void Can_Bind_To_DataContext_Of_Anchor_On_Non_Control() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + +"; + var loader = new PerspexXamlLoader(); + var window = (Window)loader.Load(xaml); + var button = window.FindControl