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 = @" - - - - - -