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 System.Linq;
using Avalonia.LogicalTree; using Avalonia.LogicalTree;
#nullable enable
namespace Avalonia.Controls.Templates namespace Avalonia.Controls.Templates
{ {
/// <summary> /// <summary>
@ -18,21 +20,23 @@ namespace Avalonia.Controls.Templates
/// tree are searched. /// tree are searched.
/// </param> /// </param>
/// <returns>The data template or null if no matching data template was found.</returns> /// <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, this IControl control,
object data, object data,
IDataTemplate primary = null) IDataTemplate? primary = null)
{ {
if (primary?.Match(data) == true) if (primary?.Match(data) == true)
{ {
return primary; 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)) if (dt.Match(data))
{ {
@ -40,20 +44,19 @@ namespace Avalonia.Controls.Templates
} }
} }
} }
currentTemplateHost = currentTemplateHost.LogicalParent;
} }
IGlobalDataTemplates global = AvaloniaLocator.Current.GetService<IGlobalDataTemplates>(); 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 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 nodes = new List<INode>();
var state = State.Start; var state = State.Start;

Loading…
Cancel
Save