/// <summary> /// Find a data template that matches a piece of data. /// </summary> /// <param name="control">The control searching for the data template.</param> /// <param name="data">The data.</param> /// <returns>The data template or null if no matching data template was found.</returns> public static IDataTemplate FindDataTemplate(this IControl control, object data) { foreach (var i in control.GetSelfAndLogicalAncestors().OfType <IControl>()) { foreach (IDataTemplate dt in i.DataTemplates) { if (dt.Match(data)) { return(dt); } } } IGlobalDataTemplates global = PerspexLocator.Current.GetService <IGlobalDataTemplates>(); if (global != null) { foreach (IDataTemplate dt in global.DataTemplates) { if (dt.Match(data)) { return(dt); } } } return(null); }
public static DataTemplate FindDataTemplate(this Control control, object data) { // TODO: This needs to traverse the logical tree, not the visual. foreach (var i in control.GetSelfAndVisualAncestors().OfType <Control>()) { foreach (DataTemplate dt in i.DataTemplates.Reverse()) { if (dt.Match(data)) { return(dt); } } } IGlobalDataTemplates global = Locator.Current.GetService <IGlobalDataTemplates>(); if (global != null) { foreach (DataTemplate dt in global.DataTemplates.Reverse()) { if (dt.Match(data)) { return(dt); } } } return(null); }
public static IDataTemplate?FindDataTemplate( this IControl control, object data, IDataTemplate?primary = null) { if (primary?.Match(data) == true) { return(primary); } var currentTemplateHost = control as ILogical; while (currentTemplateHost != null) { if (currentTemplateHost is IDataTemplateHost hostCandidate && hostCandidate.IsDataTemplatesInitialized) { foreach (IDataTemplate dt in hostCandidate.DataTemplates) { if (dt.Match(data)) { return(dt); } } } currentTemplateHost = currentTemplateHost.LogicalParent; } IGlobalDataTemplates global = AvaloniaLocator.Current.GetService <IGlobalDataTemplates>(); if (global != null && global.IsDataTemplatesInitialized) { foreach (IDataTemplate dt in global.DataTemplates) { if (dt.Match(data)) { return(dt); } } } return(null); }
/// <summary> /// Find a data template that matches a piece of data. /// </summary> /// <param name="control">The control searching for the data template.</param> /// <param name="data">The data.</param> /// <param name="primary"> /// An optional primary template that can will be tried before the DataTemplates in the /// tree are searched. /// </param> /// <returns>The data template or null if no matching data template was found.</returns> public static IDataTemplate FindDataTemplate( this IControl control, object data, IDataTemplate primary = null) { if (primary?.Match(data) == true) { return(primary); } foreach (var i in control.GetSelfAndLogicalAncestors().OfType <IDataTemplateHost>()) { if (i.IsDataTemplatesInitialized) { foreach (IDataTemplate dt in i.DataTemplates) { if (dt.Match(data)) { return(dt); } } } } IGlobalDataTemplates global = AvaloniaLocator.Current.GetService <IGlobalDataTemplates>(); if (global != null) { if (global.IsDataTemplatesInitialized) { foreach (IDataTemplate dt in global.DataTemplates) { if (dt.Match(data)) { return(dt); } } } } return(null); }