diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
index 040ed57383..dfa036b1f2 100644
--- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
+++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
@@ -43,9 +43,10 @@
+
-
+
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs
index eadad60cde..933d39bad8 100644
--- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs
@@ -48,7 +48,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
new AvaloniaXamlIlSetterTransformer(),
new AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer(),
new AvaloniaXamlIlConstructorServiceProviderTransformer(),
- new AvaloniaXamlIlTransitionsTypeMetadataTransformer()
+ new AvaloniaXamlIlTransitionsTypeMetadataTransformer(),
+ new AvaloniaXamlIlDataContextTypeTransformer()
);
// After everything else
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs
new file mode 100644
index 0000000000..5d68a72514
--- /dev/null
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using XamlIl;
+using XamlIl.Ast;
+using XamlIl.Transform;
+
+namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
+{
+ class AvaloniaXamlIlDataContextTypeTransformer : IXamlIlAstTransformer
+ {
+ public IXamlIlAstNode Transform(XamlIlAstTransformationContext context, IXamlIlAstNode node)
+ {
+ if (node is XamlIlAstObjectNode on)
+ {
+ foreach (var child in on.Children)
+ {
+ if (child is XamlIlAstXmlDirective directive)
+ {
+ if (directive.Namespace == XamlNamespaces.Xaml2006
+ && directive.Name == "DataContextType"
+ && directive.Values.Count == 1
+ && directive.Values[0] is XamlIlTypeExtensionNode dataContextType)
+ {
+ on.Children.Remove(child);
+ return new AvaloniaXamlIlDataContextTypeMetadataNode(on, dataContextType.Value);
+ }
+ }
+ }
+ }
+
+ return node;
+ }
+ }
+
+ class AvaloniaXamlIlDataContextTypeMetadataNode : XamlIlValueWithSideEffectNodeBase
+ {
+ public IXamlIlAstTypeReference DataContextType { get; set; }
+
+ public AvaloniaXamlIlDataContextTypeMetadataNode(IXamlIlAstValueNode value, IXamlIlAstTypeReference targetType)
+ : base(value, value)
+ {
+ DataContextType = targetType;
+ }
+ }
+}
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlMetadataRemover.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlMetadataRemover.cs
index 994928b7fe..608e68bf10 100644
--- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlMetadataRemover.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlMetadataRemover.cs
@@ -8,8 +8,11 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
{
public IXamlIlAstNode Transform(XamlIlAstTransformationContext context, IXamlIlAstNode node)
{
- if (node is AvaloniaXamlIlTargetTypeMetadataNode md)
- return md.Value;
+ if (node is AvaloniaXamlIlTargetTypeMetadataNode targetTypeMetadata)
+ return targetTypeMetadata.Value;
+
+ if (node is AvaloniaXamlIlDataContextTypeMetadataNode dataContextTypeMetadata)
+ return dataContextTypeMetadata.Value;
return node;
}