From 285bd5f2996dcf36fb1f98f20843cb1a2ea5aace Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 14 Sep 2015 21:42:46 +0200 Subject: [PATCH] Correctly handle setting Setter.Value. --- .../Context/PerspexXamlMemberValuePlugin.cs | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs b/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs index d7e33c0fc8..d5d864dc47 100644 --- a/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs +++ b/src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs @@ -4,9 +4,11 @@ using System; using System.Reactive.Linq; using Glass; +using OmniXaml.ObjectAssembler; using OmniXaml.Typing; using Perspex.Controls; using Perspex.Markup.Xaml.DataBinding; +using Perspex.Styling; namespace Perspex.Markup.Xaml.Context { @@ -23,30 +25,25 @@ namespace Perspex.Markup.Xaml.Context public override void SetValue(object instance, object value) { - if (ValueRequiresSpecialHandling(value)) + if (value is XamlBindingDefinition) { - HandleSpecialValue(instance, value); - } - else - { - base.SetValue(instance, value); - } - } - - private void HandleSpecialValue(object instance, object value) - { - var definition = value as XamlBindingDefinition; - if (definition != null) - { - HandleXamlBindingDefinition(definition); + HandleXamlBindingDefinition((XamlBindingDefinition)value); } else if (IsPerspexProperty) { HandlePerspexProperty(instance, value); } + else if (instance is Setter && _xamlMember.Name == "Value") + { + var setter = (Setter)instance; + var targetType = setter.Property.PropertyType; + var valuePipeline = new ValuePipeline(_xamlMember.TypeRepository); + var xamlType = _xamlMember.TypeRepository.GetXamlType(targetType); + base.SetValue(instance, valuePipeline.ConvertValueIfNecessary(value, xamlType)); + } else { - throw new InvalidOperationException($"Cannot handle the value {value} for member {this} and the instance {instance}"); + base.SetValue(instance, value); } }