From c4a81351cc45bfb11f1c8ef63cbe00362c4b3069 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 25 Oct 2015 19:10:34 +0100 Subject: [PATCH] Removed XamlBindingDefinition. And return XamlBinding directly from markup extension. --- .../Binding/XamlBindingDefinition.cs | 13 --- .../Context/PerspexXamlMemberValuePlugin.cs | 110 +++++++++--------- .../MarkupExtensions/BindingExtension.cs | 5 +- .../TemplateBindingExtension.cs | 7 +- .../Perspex.Markup.Xaml.csproj | 1 - .../Templates/TreeDataTemplate.cs | 2 +- 6 files changed, 56 insertions(+), 82 deletions(-) delete mode 100644 src/Markup/Perspex.Markup.Xaml/Binding/XamlBindingDefinition.cs diff --git a/src/Markup/Perspex.Markup.Xaml/Binding/XamlBindingDefinition.cs b/src/Markup/Perspex.Markup.Xaml/Binding/XamlBindingDefinition.cs deleted file mode 100644 index 4110169a7d..0000000000 --- a/src/Markup/Perspex.Markup.Xaml/Binding/XamlBindingDefinition.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) The Perspex Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -namespace Perspex.Markup.Xaml.Binding -{ - public class XamlBindingDefinition - { - public BindingMode Mode { get; set; } - public BindingPriority Priority { get; set; } - public RelativeSource RelativeSource { get; set; } - public string SourcePropertyPath { get; set; } - } -} \ No newline at end of file diff --git a/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs b/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs index d0af0cd491..4258dd5090 100644 --- a/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs +++ b/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs @@ -24,11 +24,24 @@ namespace Perspex.Markup.Xaml.Context _xamlMember = xamlMember; } + // ReSharper disable once MemberCanBePrivate.Global + public PerspexProperty PerspexProperty + { + get + { + var underlyingType = _xamlMember.DeclaringType.UnderlyingType; + var name = _xamlMember.Name + "Property"; + + var value = ReflectionExtensions.GetValueOfStaticField(underlyingType, name); + return value as PerspexProperty; + } + } + public override void SetValue(object instance, object value) { - if (value is XamlBindingDefinition) + if (value is XamlBinding) { - HandleXamlBindingDefinition(instance, (XamlBindingDefinition)value); + HandleXamlBindingDefinition(instance, (XamlBinding)value); } else if (IsPerspexProperty) { @@ -55,12 +68,11 @@ namespace Perspex.Markup.Xaml.Context po.SetValue(pp, value); } - private void HandleXamlBindingDefinition(object instance, XamlBindingDefinition def) + private void HandleXamlBindingDefinition(object instance, XamlBinding binding) { - if (_xamlMember.XamlType.UnderlyingType == typeof(XamlBindingDefinition)) + if (_xamlMember.XamlType.UnderlyingType == typeof(XamlBinding)) { - // TODO: This should search base classes. - var property = instance.GetType().GetTypeInfo().GetDeclaredProperty(_xamlMember.Name); + var property = instance.GetType().GetRuntimeProperty(_xamlMember.Name); if (property == null || !property.CanWrite) { @@ -68,74 +80,58 @@ namespace Perspex.Markup.Xaml.Context $"Cannot assign to '{_xamlMember.Name}' on '{instance.GetType()}"); } - property.SetValue(instance, def); + property.SetValue(instance, binding); } else { - var perspexObject = instance as PerspexObject; - var attached = _xamlMember as PerspexAttachableXamlMember; - - if (perspexObject == null) - { - throw new InvalidOperationException( - $"Cannot bind to an object of type '{instance.GetType()}"); - } - - PerspexProperty property; - string propertyName; + ApplyBinding(instance, binding); + } + } - if (attached == null) - { - propertyName = _xamlMember.Name; - property = PerspexPropertyRegistry.Instance.GetRegistered(perspexObject) - .FirstOrDefault(x => x.Name == propertyName); - } - else - { - // Ensure the OwnerType's static ctor has been run. - RuntimeHelpers.RunClassConstructor(attached.DeclaringType.UnderlyingType.TypeHandle); + private void ApplyBinding(object instance, XamlBinding binding) + { + var perspexObject = instance as PerspexObject; + var attached = _xamlMember as PerspexAttachableXamlMember; - propertyName = attached.DeclaringType.UnderlyingType.Name + '.' + _xamlMember.Name; + if (perspexObject == null) + { + throw new InvalidOperationException( + $"Cannot bind to an object of type '{instance.GetType()}"); + } - property = PerspexPropertyRegistry.Instance.GetRegistered(perspexObject) - .Where(x => x.IsAttached && x.OwnerType == attached.DeclaringType.UnderlyingType) - .FirstOrDefault(x => x.Name == _xamlMember.Name); - } + PerspexProperty property; + string propertyName; - if (property == null) - { - throw new InvalidOperationException( - $"Cannot find '{propertyName}' on '{instance.GetType()}"); - } + if (attached == null) + { + propertyName = _xamlMember.Name; + property = PerspexPropertyRegistry.Instance.GetRegistered(perspexObject) + .FirstOrDefault(x => x.Name == propertyName); + } + else + { + // Ensure the OwnerType's static ctor has been run. + RuntimeHelpers.RunClassConstructor(attached.DeclaringType.UnderlyingType.TypeHandle); - var binding = new XamlBinding - { - Mode = def.Mode, - Priority = def.Priority, - RelativeSource = def.RelativeSource, - SourcePropertyPath = def.SourcePropertyPath, - }; + propertyName = attached.DeclaringType.UnderlyingType.Name + '.' + _xamlMember.Name; - binding.Bind(perspexObject, property); + property = PerspexPropertyRegistry.Instance.GetRegistered(perspexObject) + .Where(x => x.IsAttached && x.OwnerType == attached.DeclaringType.UnderlyingType) + .FirstOrDefault(x => x.Name == _xamlMember.Name); } - } - // ReSharper disable once MemberCanBePrivate.Global - public PerspexProperty PerspexProperty - { - get + if (property == null) { - var underlyingType = _xamlMember.DeclaringType.UnderlyingType; - var name = _xamlMember.Name + "Property"; - - var value = ReflectionExtensions.GetValueOfStaticField(underlyingType, name); - return value as PerspexProperty; + throw new InvalidOperationException( + $"Cannot find '{propertyName}' on '{instance.GetType()}"); } + + binding.Bind(perspexObject, property); } private bool ValueRequiresSpecialHandling(object value) { - return value is XamlBindingDefinition || IsPerspexProperty; + return value is XamlBinding || IsPerspexProperty; } private bool IsPerspexProperty => PerspexProperty != null; diff --git a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs index 2b6e80bf3c..f7bc5c39b6 100644 --- a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs +++ b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs @@ -1,10 +1,7 @@ // Copyright (c) The Perspex 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.Linq; using OmniXaml; -using Perspex.Controls; using Perspex.Markup.Xaml.Binding; namespace Perspex.Markup.Xaml.MarkupExtensions @@ -22,7 +19,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions public override object ProvideValue(MarkupExtensionContext extensionContext) { - return new XamlBindingDefinition + return new XamlBinding { Mode = Mode, SourcePropertyPath = Path, diff --git a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TemplateBindingExtension.cs b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TemplateBindingExtension.cs index 10dad04061..b406390459 100644 --- a/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TemplateBindingExtension.cs +++ b/src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TemplateBindingExtension.cs @@ -19,12 +19,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions public override object ProvideValue(MarkupExtensionContext extensionContext) { - if (Converter != null) - { - - } - - return new XamlBindingDefinition + return new XamlBinding { Mode = Mode, Priority = BindingPriority.TemplatedParent, diff --git a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj index 59b84c3f8c..a948272d3a 100644 --- a/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj +++ b/src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj @@ -42,7 +42,6 @@ - diff --git a/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs b/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs index 6a5c28d97b..a10ca17039 100644 --- a/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs +++ b/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs @@ -19,7 +19,7 @@ namespace Perspex.Markup.Xaml.Templates [Content] public TemplateContent Content { get; set; } - public XamlBindingDefinition ItemsSource { get; set; } + public XamlBinding ItemsSource { get; set; } public bool Match(object data) {