Browse Source

Removed XamlBindingDefinition.

And return XamlBinding directly from markup extension.
pull/297/head
Steven Kirk 11 years ago
parent
commit
c4a81351cc
  1. 13
      src/Markup/Perspex.Markup.Xaml/Binding/XamlBindingDefinition.cs
  2. 110
      src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs
  3. 5
      src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs
  4. 7
      src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TemplateBindingExtension.cs
  5. 1
      src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj
  6. 2
      src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs

13
src/Markup/Perspex.Markup.Xaml/Binding/XamlBindingDefinition.cs

@ -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; }
}
}

110
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;

5
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,

7
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,

1
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@ -42,7 +42,6 @@
<Compile Include="Binding\SourceBindingEndpoint.cs" />
<Compile Include="Binding\TargetBindingEndpoint.cs" />
<Compile Include="Binding\XamlBinding.cs" />
<Compile Include="Binding\XamlBindingDefinition.cs" />
<Compile Include="Context\PerspexAttachableXamlMember.cs" />
<Compile Include="Context\PerspexContentPropertyProvider.cs" />
<Compile Include="Converters\MemberSelectorTypeConverter.cs" />

2
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)
{

Loading…
Cancel
Save