diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2017-02-01 17:03:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-01 17:03:53 +0100 |
commit | d598d5efe3ead3b57b18421253ccf05eefacfdd0 (patch) | |
tree | 9cfe45f78e71a1bbd8245019eb0ab1f3a01ee1c2 /Xamarin.Forms.Build.Tasks | |
parent | ae59382c9046501edb37882ad1c065aacce60319 (diff) | |
download | xamarin-forms-d598d5efe3ead3b57b18421253ccf05eefacfdd0.tar.gz xamarin-forms-d598d5efe3ead3b57b18421253ccf05eefacfdd0.tar.bz2 xamarin-forms-d598d5efe3ead3b57b18421253ccf05eefacfdd0.zip |
[Xaml[C]] cast to BindingBase before SetBinding() (#709)
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs index 4a8fd70c..8d087ab7 100644 --- a/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs +++ b/Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs @@ -724,7 +724,7 @@ namespace Xamarin.Forms.Build.Tasks if (CanAdd(parent, localName, valueNode, context)) return Add(parent, localName, valueNode, iXmlLineInfo, context); - throw new XamlParseException($"No property, bindable property, or event found for '{localName}'", iXmlLineInfo); + throw new XamlParseException($"No property, bindable property, or event found for '{localName}', or mismatching type between value and property.", iXmlLineInfo); } static FieldReference GetBindablePropertyReference(VariableDefinition parent, string namespaceURI, ref string localName, out bool attached, ILContext context, IXmlLineInfo iXmlLineInfo) @@ -838,6 +838,10 @@ namespace Xamarin.Forms.Build.Tasks VariableDefinition varValue; if (!context.Variables.TryGetValue(valueNode as IElementNode, out varValue)) return false; + var implicitOperator = varValue.VariableType.GetImplicitOperatorTo(module.Import(typeof(BindingBase)), module); + if (implicitOperator != null) + return true; + return varValue.VariableType.InheritsFromOrImplements(module.Import(typeof(BindingBase))); } @@ -845,6 +849,7 @@ namespace Xamarin.Forms.Build.Tasks { var module = context.Body.Method.Module; var varValue = context.Variables [elementNode]; + var implicitOperator = varValue.VariableType.GetImplicitOperatorTo(module.Import(typeof(BindingBase)), module); //TODO: check if parent is a BP var setBinding = typeof(BindableObject).GetMethod("SetBinding", new [] { typeof(BindableProperty), typeof(BindingBase) }); @@ -852,6 +857,9 @@ namespace Xamarin.Forms.Build.Tasks yield return Instruction.Create(OpCodes.Ldloc, parent); yield return Instruction.Create(OpCodes.Ldsfld, bpRef); yield return Instruction.Create(OpCodes.Ldloc, varValue); + if (implicitOperator != null) +// IL_000f: call !0 class [Xamarin.Forms.Core]Xamarin.Forms.OnPlatform`1<BindingBase>::op_Implicit(class [Xamarin.Forms.Core]Xamarin.Forms.OnPlatform`1<!0>) + yield return Instruction.Create(OpCodes.Call, module.Import(implicitOperator)); yield return Instruction.Create(OpCodes.Callvirt, module.Import(setBinding)); } |