diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs index 161bbb09ce..16e66c5b72 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlClrPropertyInfoHelper.cs +++ b/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 context, IXamlILEmitter codeGen, IXamlProperty property, IEnumerable indexerArguments = null, string indexerArgumentsKey = null) + public IXamlType Emit(XamlEmitContext context, IXamlILEmitter codeGen, IXamlProperty property, IReadOnlyCollection indexerArguments = null, string indexerArgumentsKey = null) { - indexerArguments = indexerArguments ?? Enumerable.Empty(); + indexerArguments = indexerArguments ?? Array.Empty(); 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(); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 7e25215f70..b48b4508e3 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/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(@" + + +"); + var textBox = window.GetControl("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() {