Browse Source

Actually use parent name scope for templates

pull/2740/head
Nikita Tsukanov 7 years ago
parent
commit
c61644721e
  1. 2
      src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs
  2. 32
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs

2
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
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

Loading…
Cancel
Save