summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Build.Tasks
diff options
context:
space:
mode:
authorStephane Delcroix <stephane@delcroix.org>2017-02-01 17:03:53 +0100
committerGitHub <noreply@github.com>2017-02-01 17:03:53 +0100
commitd598d5efe3ead3b57b18421253ccf05eefacfdd0 (patch)
tree9cfe45f78e71a1bbd8245019eb0ab1f3a01ee1c2 /Xamarin.Forms.Build.Tasks
parentae59382c9046501edb37882ad1c065aacce60319 (diff)
downloadxamarin-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.cs10
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));
}