Browse Source

Throw exception if trying to compile a binding under an element with its DataContext bound via a non-compiled binding.

Jeremy Koritzinsky 6 years ago
parent
commit
7020def354

+ 1 - 1
src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs

@@ -163,7 +163,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
                 return new AvaloniaXamlIlDataContextTypeMetadataNode(on, bindingResultType);
             }
 
-            return null;
+            return new AvaloniaXamlIlUninferrableDataContextMetadataNode(on);
         }
     }
 

+ 19 - 0
tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs

@@ -309,6 +309,25 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
             }
         }
 
+        [Fact]
+        public void ThrowsOnUninferrableDataTypeFromNonCompiledDataContextBindingWithCompiledBindingPath()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var xaml = @"
+<Window xmlns='https://github.com/avaloniaui'
+        xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
+        xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.MarkupExtensions;assembly=Avalonia.Markup.Xaml.UnitTests'
+        x:DataType='local:TestDataContext'>
+    <ContentControl Name='target' DataContext='{Binding}'>
+        <TextBlock Text='{CompiledBinding StringProperty}' Name='textBlock' />
+    </ContentControl>
+</Window>";
+                var loader = new AvaloniaXamlLoader();
+                Assert.Throws<XamlIlTransformException>(() => loader.Load(xaml));
+            }
+        }
+
         [Fact]
         public void InfersDataTemplateTypeFromParentCollectionItemsType()
         {