Browse Source

Add IAddChild support

pull/8436/head
Benedikt Stebner 4 years ago
parent
commit
1408e52199
  1. 6
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs
  2. 2
      src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
  3. 1
      src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
  4. 12
      src/Markup/Avalonia.Markup.Xaml/IAddChild.cs
  5. 51
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs

6
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);

2
src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github

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

1
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
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
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 =

Loading…
Cancel
Save