Browse Source

Fix compiled binding indexer always forcing integer boxing (#16109)

pull/16129/head
Max Katz 2 years ago
committed by GitHub
parent
commit
6660d7572b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs
  2. 30
      tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs

12
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs

@ -34,9 +34,9 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
return baseKey + $"[{indexerArgumentsKey}]";
}
public IXamlType Emit(XamlEmitContext<IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen, IXamlProperty property, IEnumerable<IXamlAstValueNode> indexerArguments = null, string indexerArgumentsKey = null)
public IXamlType Emit(XamlEmitContext<IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen, IXamlProperty property, IReadOnlyCollection<IXamlAstValueNode> indexerArguments = null, string indexerArgumentsKey = null)
{
indexerArguments = indexerArguments ?? Enumerable.Empty<IXamlAstValueNode>();
indexerArguments = indexerArguments ?? Array.Empty<IXamlAstValueNode>();
var types = context.GetAvaloniaTypes();
IXamlMethod Get()
{
@ -101,10 +101,12 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
Load(property.Setter, setter.Generator, !property.Getter.IsStatic);
setter.Generator.Ldarg(1);
if (property.Setter.Parameters[0].IsValueType)
setter.Generator.Unbox_Any(property.Setter.Parameters[0]);
var valueIndex = indexerArguments.Count;
if (property.Setter.Parameters[valueIndex].IsValueType)
setter.Generator.Unbox_Any(property.Setter.Parameters[valueIndex]);
else
setter.Generator.Castclass(property.Setter.Parameters[0]);
setter.Generator.Castclass(property.Setter.Parameters[valueIndex]);
setter.Generator
.EmitCall(property.Setter, true)
.Ret();

30
tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs

@ -305,6 +305,36 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
}
}
[Fact]
public void IndexerSetterBindsCorrectly()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var window = (Window)AvaloniaRuntimeXamlLoader.Load(@"
<Window xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.MarkupExtensions;assembly=Avalonia.Markup.Xaml.UnitTests'
x:DataType='local:TestDataContext'>
<TextBox Text='{CompiledBinding ListProperty[3], Mode=TwoWay}' Name='textBox' />
</Window>");
var textBox = window.GetControl<TextBox>("textBox");
var dataContext = new TestDataContext
{
ListProperty = { "A", "B", "C", "D", "E" }
};
window.DataContext = dataContext;
Assert.Equal(dataContext.ListProperty[3], textBox.Text);
textBox.Text = "Z";
Assert.Equal("Z", dataContext.ListProperty[3]);
Assert.Equal(dataContext.ListProperty[3], textBox.Text);
}
}
[Fact]
public void ResolvesArrayIndexerBindingCorrectly()
{

Loading…
Cancel
Save