diff --git a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs index f6e28483fd..d4e2c25c42 100644 --- a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs +++ b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs @@ -1,6 +1,8 @@ using System.Linq; using Avalonia.LogicalTree; +#nullable enable + namespace Avalonia.Controls.Templates { /// @@ -18,21 +20,23 @@ namespace Avalonia.Controls.Templates /// tree are searched. /// /// The data template or null if no matching data template was found. - public static IDataTemplate FindDataTemplate( + public static IDataTemplate? FindDataTemplate( this IControl control, object data, - IDataTemplate primary = null) + IDataTemplate? primary = null) { if (primary?.Match(data) == true) { return primary; } - foreach (var i in control.GetSelfAndLogicalAncestors().OfType()) + var currentTemplateHost = control as ILogical; + + while (currentTemplateHost != null) { - if (i.IsDataTemplatesInitialized) + if (currentTemplateHost is IDataTemplateHost hostCandidate && hostCandidate.IsDataTemplatesInitialized) { - foreach (IDataTemplate dt in i.DataTemplates) + foreach (IDataTemplate dt in hostCandidate.DataTemplates) { if (dt.Match(data)) { @@ -40,20 +44,19 @@ namespace Avalonia.Controls.Templates } } } + + currentTemplateHost = currentTemplateHost.LogicalParent; } IGlobalDataTemplates global = AvaloniaLocator.Current.GetService(); - if (global != null) + if (global != null && global.IsDataTemplatesInitialized) { - if (global.IsDataTemplatesInitialized) + foreach (IDataTemplate dt in global.DataTemplates) { - foreach (IDataTemplate dt in global.DataTemplates) + if (dt.Match(data)) { - if (dt.Match(data)) - { - return dt; - } + return dt; } } } diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs index 8de64e56ff..8e5631e198 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs @@ -16,7 +16,7 @@ namespace Avalonia.Markup.Parsers internal static class BindingExpressionGrammar { - public static (IList Nodes, SourceMode Mode) Parse(ref CharacterReader r) + public static (List Nodes, SourceMode Mode) Parse(ref CharacterReader r) { var nodes = new List(); var state = State.Start;