diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs index ce31c89b6f..6b4f32bce0 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlDataContextTypeTransformer.cs @@ -92,7 +92,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers && type is IXamlType xamlType) { parentObject = context.ParentNodes().OfType() - .FirstOrDefault(n => n.Type.GetClrType().FullName == xamlType.FullName); + .FirstOrDefault(n => xamlType.IsAssignableFrom(n.Type.GetClrType())); } else { diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 5e0813c9e6..727ebeab40 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -608,7 +608,45 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions Assert.Equal(dataContext.ListProperty[0], (string?)((ContentPresenter)target.Presenter.Panel!.Children[0]).Content); } } - + + [Fact] + public void InfersDataTypeFromParentDataGridItemsTypeInCaseOfControlInheritance() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var window = (Window)AvaloniaRuntimeXamlLoader.Load(@" + + + + + + + +"); + var target = window.GetControl("target"); + var column = target.Columns.Single(); + + var dataContext = new TestItemsCollectionDataContext(); + + dataContext.Items.Add(new TestData() { StringProperty = "Test" }); + + window.DataContext = dataContext; + + window.ApplyTemplate(); + target.ApplyTemplate(); + + // Assert DataGridLikeColumn.Binding data type. + var compiledPath = ((CompiledBindingExtension)column.Binding!).Path; + var node = Assert.IsType(Assert.Single(compiledPath.Elements)); + + Assert.Equal(typeof(string), node.Property.PropertyType); + Assert.Equal(nameof(TestData.StringProperty), node.Property.Name); + } + } + [Fact] public void InfersDataTemplateTypeFromParentDataGridItemsType() { @@ -2239,6 +2277,11 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions public class TestDataContextBaseClass {} + public class TestItemsCollectionDataContext : TestDataContextBaseClass + { + public ObservableCollection Items { get; } = new ObservableCollection(); + } + public class TestDataContext : TestDataContextBaseClass, IHasPropertyDerived, IHasExplicitProperty { public bool BoolProperty { get; set; } @@ -2391,6 +2434,9 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions public IDataTemplate? Template { get; set; } } + public class DataGridLikeControlInheritor : DataGridLikeControl + { } + public class ImplicitConvertible { public ImplicitConvertible(string value) => Value = value;