diff --git a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
index e864ea2007..da17b80e25 100644
--- a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
+++ b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
@@ -89,6 +89,9 @@
Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs
index 22f1a8bc00..fceebf860d 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs
@@ -1,4 +1,6 @@
+using System.Collections.Generic;
using System.Linq;
+using Avalonia.Data;
using XamlX.Ast;
using XamlX.Transform;
@@ -19,9 +21,15 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
{
// If there are any setters which accept a binding priority, then add the Style
// binding priority as a value.
- if (avaloniaProperty.Setters.Any(x => x.Parameters[0] == bindingPriorityType))
+ var setPriorityValueSetter =
+ avaloniaProperty.Setters.FirstOrDefault(x => x.Parameters[0] == bindingPriorityType);
+
+ if(setPriorityValueSetter != null
+ && prop.Values.Count == 1
+ && setPriorityValueSetter.Parameters[1].IsAssignableFrom(prop.Values[0].Type.GetClrType()))
{
- prop.Values.Insert(0, new XamlConstantNode(node, bindingPriorityType, 1));
+ prop.PossibleSetters = new List { setPriorityValueSetter };
+ prop.Values.Insert(0, new XamlConstantNode(node, bindingPriorityType, (int)BindingPriority.Style));
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
index eb3b7b8f7e..cc84fb0e52 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
@@ -16,6 +16,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
public IXamlType AvaloniaProperty { get; }
public IXamlType AvaloniaPropertyT { get; }
public IXamlType StyledPropertyT { get; }
+ public IXamlMethod AvaloniaObjectSetStyledPropertyValue { get; }
public IXamlType AvaloniaAttachedPropertyT { get; }
public IXamlType IBinding { get; }
public IXamlMethod AvaloniaObjectBindMethod { get; }
@@ -98,6 +99,11 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
StyledPropertyT = cfg.TypeSystem.GetType("Avalonia.StyledProperty`1");
AvaloniaAttachedPropertyT = cfg.TypeSystem.GetType("Avalonia.AttachedProperty`1");
BindingPriority = cfg.TypeSystem.GetType("Avalonia.Data.BindingPriority");
+ AvaloniaObjectSetStyledPropertyValue = AvaloniaObject
+ .FindMethod(m => m.IsPublic && !m.IsStatic && m.Name == "SetValue"
+ && m.Parameters.Count == 3
+ && m.Parameters[0].Name == "StyledPropertyBase`1"
+ && m.Parameters[2].Equals(BindingPriority));
IBinding = cfg.TypeSystem.GetType("Avalonia.Data.IBinding");
IDisposable = cfg.TypeSystem.GetType("System.IDisposable");
Transitions = cfg.TypeSystem.GetType("Avalonia.Animation.Transitions");
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
index 6c61ad0705..a568cbcef4 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
@@ -257,24 +257,24 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
public override void Emit(IXamlILEmitter emitter)
{
- var method = Types.AvaloniaObject
- .FindMethod(m => m.IsPublic && !m.IsStatic && m.Name == "SetValue"
- && m.Parameters.Count == 3
- && m.Parameters[0].Name == "StyledPropertyBase`1"
- && m.Parameters[2].Equals(Types.BindingPriority));
-
- if (method == null)
- throw new XamlTypeSystemException(
- $"Unable to find AvaloniaObject.SetValue(StyledPropertyBase, T, BindingPriority).");
-
- method = method.MakeGenericMethod(new[] { Parameters[1] });
-
- using (var bloc = emitter.LocalsPool.GetLocal(Parameters[1]))
+ /*
+ Current stack:
+ - object
+ - binding priority
+ - value
+ */
+
+ var method = Types.AvaloniaObjectSetStyledPropertyValue
+ .MakeGenericMethod(new[] { Parameters[1] });
+
+ using (var valueLocal = emitter.LocalsPool.GetLocal(Parameters[1]))
+ using (var priorityLocal = emitter.LocalsPool.GetLocal(Types.Int))
emitter
- .Stloc(bloc.Local)
+ .Stloc(valueLocal.Local)
+ .Stloc(priorityLocal.Local)
.Ldsfld(AvaloniaProperty)
- .Ldloc(bloc.Local)
- .Ldc_I4(0)
+ .Ldloc(valueLocal.Local)
+ .Ldloc(priorityLocal.Local)
.EmitCall(method, true);
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
index 8e20d65eb5..e0cfcd0ef6 160000
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
@@ -1 +1 @@
-Subproject commit 8e20d65eb5f1efbae08e49b18f39bfdce32df7b3
+Subproject commit e0cfcd0ef687e613ef8905e8d0891974b68c565d