Browse Source

Merge pull request #8436 from Gillibald/feature/IAddChild

Add IAddChild support
Max Katz 3 years ago
parent
commit
42baebdd96

+ 4 - 2
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<string>
                 {
@@ -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);
 

+ 1 - 1
src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github

@@ -1 +1 @@
-Subproject commit daaac590e078967b78045f74c38ef046d00d8582
+Subproject commit a4e6be2d1407abec4f35fcb208848830ce513ead

+ 1 - 0
src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj

@@ -15,6 +15,7 @@
         <Compile Include="Converters\FontFamilyTypeConverter.cs" />
         <Compile Include="Converters\TimeSpanTypeConverter.cs" />
         <Compile Include="Extensions.cs" />
+        <Compile Include="IAddChild.cs" />
         <Compile Include="MarkupExtension.cs" />
         <Compile Include="MarkupExtensions\CompiledBindingExtension.cs" />
         <Compile Include="MarkupExtensions\CompiledBindings\ArrayElementPlugin.cs" />

+ 12 - 0
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<T> : IAddChild
+    {
+        void AddChild(T child);
+    }
+}

+ 51 - 0
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 = @"<ObjectWithAddChild  xmlns='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml'>Foo</ObjectWithAddChild>";
+
+            var target = AvaloniaRuntimeXamlLoader.Parse<ObjectWithAddChild>(xaml);
+
+            Assert.NotNull(target);
+            Assert.Equal("Foo", target.Child);
+        }
+
+        [Fact]
+        public void AddChildOfT_Child_Is_Set()
+        {
+            var xaml = @"<ObjectWithAddChildOfT  xmlns='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml'>Foo</ObjectWithAddChildOfT>";
+
+            var target = AvaloniaRuntimeXamlLoader.Parse<ObjectWithAddChildOfT>(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<string>
+    {
+        public string Text { get; set; }
+
+        public object Child { get; set; }
+
+        void IAddChild.AddChild(object child)
+        {
+            Child = child;
+        }
+
+        void IAddChild<string>.AddChild(string child)
+        {
+            Text = child;
+        }
+    }
+
     public class BasicTestsAttachedPropertyHolder
     {
         public static AvaloniaProperty<string> FooProperty =