Browse Source

Fix a few not needed allocations.

pull/5026/head
Dariusz Komosinski 6 years ago
parent
commit
380ada052f
  1. 27
      src/Avalonia.Controls/Templates/DataTemplateExtensions.cs
  2. 2
      src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs

27
src/Avalonia.Controls/Templates/DataTemplateExtensions.cs

@ -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;
}
}
}

2
src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs

@ -16,7 +16,7 @@ namespace Avalonia.Markup.Parsers
internal static class BindingExpressionGrammar
{
public static (IList<INode> Nodes, SourceMode Mode) Parse(ref CharacterReader r)
public static (List<INode> Nodes, SourceMode Mode) Parse(ref CharacterReader r)
{
var nodes = new List<INode>();
var state = State.Start;

Loading…
Cancel
Save