|
|
|
@ -1,6 +1,8 @@ |
|
|
|
using System.Linq; |
|
|
|
using Avalonia.LogicalTree; |
|
|
|
|
|
|
|
#nullable enable |
|
|
|
|
|
|
|
namespace Avalonia.Controls.Templates |
|
|
|
{ |
|
|
|
/// <summary>
|
|
|
|
@ -18,21 +20,23 @@ namespace Avalonia.Controls.Templates |
|
|
|
/// tree are searched.
|
|
|
|
/// </param>
|
|
|
|
/// <returns>The data template or null if no matching data template was found.</returns>
|
|
|
|
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<IDataTemplateHost>()) |
|
|
|
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<IGlobalDataTemplates>(); |
|
|
|
|
|
|
|
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; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|