diff --git a/samples/BindingTest/MainWindow.paml b/samples/BindingTest/MainWindow.paml
index 3a378fcd24..57f01c729a 100644
--- a/samples/BindingTest/MainWindow.paml
+++ b/samples/BindingTest/MainWindow.paml
@@ -6,7 +6,7 @@
-
+
@@ -30,6 +30,11 @@
+
+
+
+
diff --git a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
index 8cc5a981f5..596ad401df 100644
--- a/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
+++ b/src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
@@ -4,7 +4,6 @@
using System;
using System.Reactive.Linq;
using System.Reactive.Subjects;
-using OmniXaml.TypeConversion;
using Perspex.Controls;
using Perspex.Markup.Data;
@@ -20,6 +19,11 @@ namespace Perspex.Markup.Xaml.Data
///
public IValueConverter Converter { get; set; }
+ ///
+ /// Gets or sets the name of the element to use as the binding source.
+ ///
+ public string ElementName { get; set; }
+
///
/// Gets or sets the binding mode.
///
@@ -47,8 +51,11 @@ namespace Perspex.Markup.Xaml.Data
/// The target property.
public void Bind(IObservablePropertyBag instance, PerspexProperty property)
{
+ Contract.Requires(instance != null);
+ Contract.Requires(property != null);
+
var subject = CreateSubject(
- instance,
+ instance,
property.PropertyType,
property == Control.DataContextProperty);
@@ -72,15 +79,22 @@ namespace Perspex.Markup.Xaml.Data
Type targetType,
bool targetIsDataContext = false)
{
+ Contract.Requires(target != null);
+ Contract.Requires(targetType != null);
+
ExpressionObserver observer;
- if (RelativeSource == null || RelativeSource.Mode == RelativeSourceMode.DataContext)
+ if (ElementName != null)
+ {
+ observer = CreateElementSubject((IControl)target);
+ }
+ else if (RelativeSource == null || RelativeSource.Mode == RelativeSourceMode.DataContext)
{
- observer = CreateDataContextExpressionSubject(target, targetIsDataContext);
+ observer = CreateDataContextSubject(target, targetIsDataContext);
}
else if (RelativeSource.Mode == RelativeSourceMode.TemplatedParent)
{
- observer = CreateTemplatedParentExpressionSubject(target);
+ observer = CreateTemplatedParentSubject(target);
}
else
{
@@ -88,8 +102,8 @@ namespace Perspex.Markup.Xaml.Data
}
return new ExpressionSubject(
- observer,
- targetType,
+ observer,
+ targetType,
Converter ?? DefaultValueConverter.Instance);
}
@@ -101,6 +115,10 @@ namespace Perspex.Markup.Xaml.Data
/// The binding subject.
internal void Bind(IObservablePropertyBag target, PerspexProperty property, ISubject