diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
index e07c22d750..a1db5c2915 100644
--- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
+++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
@@ -39,7 +39,6 @@
-
@@ -73,8 +72,6 @@
-
-
diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs
index 3f12593197..eb5f87ea2a 100644
--- a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs
@@ -83,6 +83,8 @@ namespace Avalonia.Markup.Xaml.Data
///
public object Source { get; set; }
+ internal WeakReference DefaultAnchor { get; set; }
+
///
public InstancedBinding Initiate(
IAvaloniaObject target,
@@ -92,6 +94,8 @@ namespace Avalonia.Markup.Xaml.Data
{
Contract.Requires(target != null);
+ anchor = anchor ?? DefaultAnchor?.Target;
+
var pathInfo = ParsePath(Path);
ValidateState(pathInfo);
enableDataValidation = enableDataValidation && Priority == BindingPriority.LocalValue;
diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs
deleted file mode 100644
index 787aebbdc6..0000000000
--- a/src/Markup/Avalonia.Markup.Xaml/Data/StyleResourceBinding.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) The Avalonia Project. All rights reserved.
-// Licensed under the MIT license. See licence.md file in the project root for full license information.
-
-using System;
-using System.Reactive.Disposables;
-using System.Reactive.Linq;
-using System.Reactive.Subjects;
-using Avalonia.Controls;
-using Avalonia.Data;
-using Avalonia.Styling;
-
-namespace Avalonia.Markup.Xaml.Data
-{
- public class StyleResourceBinding : IBinding
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The resource name.
- public StyleResourceBinding(string name)
- {
- Name = name;
- }
-
- ///
- public BindingMode Mode => BindingMode.OneTime;
-
- ///
- /// Gets the resource name.
- ///
- public string Name { get; }
-
- ///
- public BindingPriority Priority => BindingPriority.LocalValue;
-
- ///
- public InstancedBinding Initiate(
- IAvaloniaObject target,
- AvaloniaProperty targetProperty,
- object anchor = null,
- bool enableDataValidation = false)
- {
- var host = (target as IControl) ?? (anchor as IControl);
- var style = anchor as IStyle;
- var resource = AvaloniaProperty.UnsetValue;
-
- if (host != null)
- {
- resource = host.FindResource(Name);
- }
- else if (style != null)
- {
- if (!style.TryGetResource(Name, out resource))
- {
- resource = AvaloniaProperty.UnsetValue;
- }
- }
-
- if (resource != AvaloniaProperty.UnsetValue)
- {
- return new InstancedBinding(resource, Priority);
- }
- else
- {
- return null;
- }
- }
- }
-}
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs
index 9d1e36ee78..8984498393 100644
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/BindingExtension.cs
@@ -7,8 +7,13 @@ using System;
namespace Avalonia.Markup.Xaml.MarkupExtensions
{
+ using Avalonia.Controls;
+ using Avalonia.Styling;
+ using Portable.Xaml;
+ using Portable.Xaml.ComponentModel;
using Portable.Xaml.Markup;
using PortableXaml;
+ using System.ComponentModel;
[MarkupExtensionReturnType(typeof(IBinding))]
public class BindingExtension : MarkupExtension
@@ -24,7 +29,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
public override object ProvideValue(IServiceProvider serviceProvider)
{
- var b = new Binding
+ return new Binding
{
Converter = Converter,
ConverterParameter = ConverterParameter,
@@ -33,10 +38,26 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
Mode = Mode,
Path = Path,
Priority = Priority,
- RelativeSource = RelativeSource
+ RelativeSource = RelativeSource,
+ DefaultAnchor = new WeakReference(GetDefaultAnchor((ITypeDescriptorContext)serviceProvider))
};
+ }
+
+
+ private static object GetDefaultAnchor(ITypeDescriptorContext context)
+ {
+ object anchor = null;
+
+ // The target is not a control, so we need to find an anchor that will let us look
+ // up named controls and style resources. First look for the closest IControl in
+ // the context.
+ anchor = context.GetFirstAmbientValue();
- return XamlBinding.FromMarkupExtensionContext(b, serviceProvider);
+ // If a control was not found, then try to find the highest-level style as the XAML
+ // file could be a XAML file containing only styles.
+ return anchor ??
+ context.GetService()?.RootObject as IStyle ??
+ context.GetLastOrDefaultAmbientValue();
}
public IValueConverter Converter { get; set; }
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs
deleted file mode 100644
index 55a1b72125..0000000000
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleResourceExtension.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) The Avalonia Project. All rights reserved.
-// Licensed under the MIT license. See licence.md file in the project root for full license information.
-
-using Avalonia.Data;
-using Avalonia.Markup.Xaml.Data;
-using System;
-
-namespace Avalonia.Markup.Xaml.MarkupExtensions
-{
- using Portable.Xaml.Markup;
- using PortableXaml;
-
- [MarkupExtensionReturnType(typeof(IBinding))]
- public class StyleResourceExtension : MarkupExtension
- {
- public StyleResourceExtension(string name)
- {
- Name = name;
- }
-
- public override object ProvideValue(IServiceProvider serviceProvider)
- {
- return XamlBinding.FromMarkupExtensionContext(
- new StyleResourceBinding(Name),
- serviceProvider);
- }
-
- [ConstructorArgument("name")]
- public string Name { get; set; }
- }
-}
\ No newline at end of file
diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs
index a38029964f..7de96ea220 100644
--- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs
@@ -212,11 +212,6 @@ namespace Avalonia.Markup.Xaml.PortableXaml
value);
}
- if (value is XamlBinding)
- {
- value = (value as XamlBinding).Value;
- }
-
if (UpdateListInsteadSet &&
value != null &&
UpdateListInsteadSetValue(instance, value))
@@ -317,9 +312,7 @@ namespace Avalonia.Markup.Xaml.PortableXaml
if (!Member.AssignBinding)
ApplyBinding(obj, (IBinding)value);
else
- obj.SetValue(Property, value is XamlBinding ?
- (value as XamlBinding).Value :
- value);
+ obj.SetValue(Property, value);
}
else
{
@@ -348,12 +341,9 @@ namespace Avalonia.Markup.Xaml.PortableXaml
{
var control = obj as IControl;
var property = Property;
- var xamlBinding = binding as XamlBinding;
if (control != null && property != Control.DataContextProperty)
DelayedBinding.Add(control, property, binding);
- else if (xamlBinding != null)
- obj.Bind(property, xamlBinding.Value, xamlBinding.Anchor?.Target);
else
obj.Bind(property, binding);
}
diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs
deleted file mode 100644
index 1f4e66471c..0000000000
--- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/XamlBinding.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-using Avalonia.Controls;
-using Avalonia.Data;
-using Avalonia.Styling;
-using Portable.Xaml;
-using Portable.Xaml.ComponentModel;
-using System.ComponentModel;
-using Portable.Xaml.Markup;
-using System;
-
-namespace Avalonia.Markup.Xaml.PortableXaml
-{
- internal class XamlBinding : IBinding
- {
- public static IBinding FromMarkupExtensionContext(
- IBinding binding,
- IServiceProvider serviceProvider)
- {
- var context = (ITypeDescriptorContext)serviceProvider;
- var pvt = context.GetService();
-
- if (pvt.TargetObject is IControl) return binding;
-
- object anchor = GetDefaultAnchor(context);
-
- if (anchor == null) return binding;
-
- return new XamlBinding(binding, anchor);
- }
-
- private static object GetDefaultAnchor(ITypeDescriptorContext context)
- {
- object anchor = null;
-
- // The target is not a control, so we need to find an anchor that will let us look
- // up named controls and style resources. First look for the closest IControl in
- // the context.
- anchor = context.GetFirstAmbientValue();
-
- // If a control was not found, then try to find the highest-level style as the XAML
- // file could be a XAML file containing only styles.
- return anchor ??
- context.GetService()?.RootObject as IStyle ??
- context.GetLastOrDefaultAmbientValue();
- }
-
- private XamlBinding(IBinding binding, object anchor)
- {
- Value = binding;
-
- Anchor = new WeakReference(anchor);
- }
-
- public WeakReference Anchor { get; }
-
- public IBinding Value { get; }
-
- public InstancedBinding Initiate(IAvaloniaObject target, AvaloniaProperty targetProperty, object anchor = null, bool enableDataValidation = false)
- {
- return Value.Initiate(target, targetProperty,
- anchor ?? Anchor.Target, enableDataValidation);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
index 8c7dad1bce..03dc5374e0 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
@@ -411,8 +411,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
var xaml = @"
-
-
+
";
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
index 65fc9eaddd..b339972029 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/StyleTests.cs
@@ -61,171 +61,6 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
}
}
- [Fact]
- public void StyleResource_Can_Be_Assigned_To_Property()
- {
- var xaml = @"
-
-
-
-
-
-
-";
-
- var loader = new AvaloniaXamlLoader();
- var userControl = (UserControl)loader.Load(xaml);
- var border = userControl.FindControl("border");
-
- DelayedBinding.ApplyBindings(border);
-
- var brush = (SolidColorBrush)border.Background;
- Assert.Equal(0xff506070, brush.Color.ToUint32());
- }
-
- [Fact]
- public void StyleResource_Can_Be_Assigned_To_Setter()
- {
- //skip default theme and styles, they are not needed
- using (UnitTestApplication.Start(TestServices.StyledWindow
- .With(theme: () => new Styles())))
- {
- var xaml = @"
-
-
-
-
-
-
-";
-
- var loader = new AvaloniaXamlLoader();
- var window = (Window)loader.Load(xaml);
- var button = window.FindControl