Browse Source

Actually use parent name scope for templates

Nikita Tsukanov 6 years ago
parent
commit
c61644721e

+ 1 - 1
src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs

@@ -19,9 +19,9 @@ namespace Avalonia.Markup.Xaml.XamlIl.Runtime
             var resourceNodes = provider.GetService<IAvaloniaXamlIlParentStackProvider>().Parents
                 .OfType<IResourceNode>().ToList();
             var rootObject = provider.GetService<IRootObjectProvider>().RootObject;
+            var parentScope = provider.GetService<INameScope>();
             return sp =>
             {
-                var parentScope = sp.GetService<INameScope>();
                 var scope = parentScope != null ? new ChildNameScope(parentScope) : (INameScope)new NameScope();
                 var obj = builder(new DeferredParentServiceProvider(sp, resourceNodes, rootObject, scope));
                 scope.Complete();

+ 32 - 0
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs

@@ -234,6 +234,38 @@ namespace Avalonia.Markup.Xaml.UnitTests
                 Assert.Equal(100, XamlIlBugTestsStaticClassWithAttachedProperty.GetTestInt(tb));
             }
         }
+
+        [Fact]
+        public void DataTemplates_Should_Resolve_Named_Controls_From_Parent_Scope()
+        {
+            using (UnitTestApplication.Start(TestServices.StyledWindow))
+            {
+                var parsed = (Window)AvaloniaXamlLoader.Parse(@"
+<Window
+  xmlns='https://github.com/avaloniaui'
+  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
+>
+  <StackPanel>
+    <StackPanel.DataTemplates>
+      <DataTemplate DataType='{x:Type x:String}'>
+       <TextBlock Classes='target' Text='{Binding #txt.Text}'/>
+      </DataTemplate>
+    </StackPanel.DataTemplates>
+    <TextBlock Text='Test' Name='txt'/>
+    <ContentControl Content='tst'/>
+  </StackPanel>
+</Window>
+");
+                parsed.DataContext = new List<string>() {"Test"};
+                parsed.Show();
+                parsed.ApplyTemplate();
+                var cc = ((ContentControl)((StackPanel)parsed.Content).Children.Last());
+                cc.ApplyTemplate();
+                var templated = cc.GetVisualDescendants().OfType<TextBlock>()
+                    .First(x => x.Classes.Contains("target"));
+                Assert.Equal("Test", templated.Text);
+            }
+        }
     }
     
     public class XamlIlBugTestsEventHandlerCodeBehind : Window