diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs index 8ed94f6b20..54eac8f59e 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs @@ -41,7 +41,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions }, WhitespaceSignificantCollectionAttributes = { - typeSystem.GetType("Avalonia.Metadata.WhitespaceSignificantCollectionAttribute") + typeSystem.GetType("Avalonia.Metadata.WhitespaceSignificantCollectionAttribute") }, TrimSurroundingWhitespaceAttributes = { @@ -56,7 +56,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions XmlNamespaceInfoProvider = typeSystem.GetType("Avalonia.Markup.Xaml.XamlIl.Runtime.IAvaloniaXamlIlXmlNamespaceInfoProvider"), - DeferredContentPropertyAttributes = {typeSystem.GetType("Avalonia.Metadata.TemplateContentAttribute")}, + DeferredContentPropertyAttributes = { typeSystem.GetType("Avalonia.Metadata.TemplateContentAttribute") }, DeferredContentExecutorCustomizationDefaultTypeParameter = typeSystem.GetType("Avalonia.Controls.IControl"), DeferredContentExecutorCustomizationTypeParameterDeferredContentAttributePropertyNames = new List { @@ -70,6 +70,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions }, InnerServiceProviderFactoryMethod = runtimeHelpers.FindMethod(m => m.Name == "CreateInnerServiceProviderV1"), + IAddChild = typeSystem.GetType("Avalonia.Markup.Xaml.IAddChild"), + IAddChildOfT = typeSystem.GetType("Avalonia.Markup.Xaml.IAddChild`1") }; rv.CustomAttributeResolver = new AttributeResolver(typeSystem, rv); diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github index daaac590e0..a4e6be2d14 160000 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github @@ -1 +1 @@ -Subproject commit daaac590e078967b78045f74c38ef046d00d8582 +Subproject commit a4e6be2d1407abec4f35fcb208848830ce513ead diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 30d321426f..c35cbc35c0 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/IAddChild.cs b/src/Markup/Avalonia.Markup.Xaml/IAddChild.cs new file mode 100644 index 0000000000..993eb6142d --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/IAddChild.cs @@ -0,0 +1,12 @@ +namespace Avalonia.Markup.Xaml +{ + public interface IAddChild + { + void AddChild(object child); + } + + public interface IAddChild : IAddChild + { + void AddChild(T child); + } +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index f12785a7ce..bed5f19ecb 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -958,6 +958,29 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml Assert.Equal("Foo", toolTip.Content); } + [Fact] + public void AddChild_Child_Is_Set() + { + var xaml = @"Foo"; + + var target = AvaloniaRuntimeXamlLoader.Parse(xaml); + + Assert.NotNull(target); + Assert.Equal("Foo", target.Child); + } + + [Fact] + public void AddChildOfT_Child_Is_Set() + { + var xaml = @"Foo"; + + var target = AvaloniaRuntimeXamlLoader.Parse(xaml); + + Assert.NotNull(target); + Assert.Null(target.Child); + Assert.Equal("Foo", target.Text); + } + private class SelectedItemsViewModel : INotifyPropertyChanged { public string[] Items { get; set; } @@ -977,6 +1000,34 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml } } } + + public class ObjectWithAddChild : IAddChild + { + public object Child { get; set; } + + void IAddChild.AddChild(object child) + { + Child = child; + } + } + + public class ObjectWithAddChildOfT : IAddChild + { + public string Text { get; set; } + + public object Child { get; set; } + + void IAddChild.AddChild(object child) + { + Child = child; + } + + void IAddChild.AddChild(string child) + { + Text = child; + } + } + public class BasicTestsAttachedPropertyHolder { public static AvaloniaProperty FooProperty =