public Task <IVisualElement> GetVisualAsync(IMarkupNode node, Type dataContextType, IVisualLineage visualLineage, ApplyVisualStyles applyStyles) { return(GetVisualAsync(node, dataContextType, VisualTypeResolver.DefaultNamespaceSeed, visualLineage, applyStyles)); }
private async Task <IDataTemplate> BuildDataTemplateAsync(IMarkupNode node, Type?dataContextType, Dictionary <String, String> nameSpaceAssemblySearch, IVisualLineage visualLineage, ApplyVisualStyles applyStyles) { if (node.ChildrenCount != 1) { var visuals = new List <IVisualElement>(); foreach (var childNode in node.Children) { var visual = await GetVisualAsync(childNode, dataContextType, nameSpaceAssemblySearch, visualLineage, applyStyles).ConfigureAwait(false); visuals.Add(visual); } return(new MultiDataTemplate(_visualBootstrapper, dataContextType, visuals)); } var onlyChild = node.Children.First(); switch (onlyChild.Name) { case nameof(MultiDataTemplate): var dataBindings = (await _bindingBuilder.GetBindingsDictionaryAsync(node, dataContextType, nameSpaceAssemblySearch)).Values.OfType <IDataBinding>(); dataContextType = _bindingBuilder.InferDataContextTypeFromBindings(dataBindings, dataContextType); return(await BuildDataTemplateAsync(onlyChild, dataContextType, nameSpaceAssemblySearch, visualLineage, applyStyles).ConfigureAwait(false)); case nameof(DataTemplate): return(await BuildDataTemplateAsync(onlyChild, dataContextType, nameSpaceAssemblySearch, visualLineage, applyStyles).ConfigureAwait(false)); default: var visualContent = await GetVisualAsync(onlyChild, dataContextType, nameSpaceAssemblySearch, visualLineage, applyStyles).ConfigureAwait(false); visualLineage.AssertPopVisual(visualContent); return(new DataTemplate(_visualBootstrapper, dataContextType, visualContent)); } }
private async Task <IContentVisual> BuildContentVisualAsync(IMarkupNode node, Type?dataContextType, Dictionary <String, String> nameSpaceAssemblySearch, Type visualType, IVisualLineage visualLineage, ApplyVisualStyles applyStyles) { IVisualElement?contentVisual = null; //------------------------------- var contentContainer = _visualBootstrapper.Instantiate <IContentVisual>(visualType) ?? throw new InvalidOperationException(); //await applyStyles(contentContainer, node, visualLineage, this); //------------------------------- visualLineage.PushVisual(contentContainer); switch (node.ChildrenCount) { case 1: { var currentNode = node[0]; var childObjRes = await InflateChildAsync(currentNode, contentContainer, dataContextType, nameSpaceAssemblySearch, visualLineage, applyStyles) .ConfigureAwait(false); if (childObjRes.ChildType == ChildNodeType.ChildVisual && childObjRes.Child is IVisualElement childVisual) { contentVisual = childVisual; } else if (childObjRes.ChildType == ChildNodeType.PropertyValue && childObjRes.VisualProperty is { } prop) { //Object oContentContainer = contentContainer; prop.SetPropertyValue(ref contentContainer, childObjRes.Child); //prop.SetValue(contentContainer, childObjRes.Child, null); } break; } case 0: { if (!node.TryGetAttributeValue(nameof(IContentContainer.Content), out var textContent)) { textContent = node.InnerText; } if (!String.IsNullOrEmpty(textContent)) { // zb <button>TEXT</button> etc contentVisual = new Label(_visualBootstrapper) { Text = textContent ! }; visualLineage.PushVisual(contentVisual); } break; } default: throw new NotImplementedException(); } contentContainer !.Content = contentVisual; if (contentVisual != null) { visualLineage.AssertPopVisual(contentVisual); } return(contentContainer); }
/// <summary> /// Builds a visual from a markup node. Infers the data context type and instantiates /// a generic visual if possible /// </summary> /// <param name="node">an xml/json etc node</param> /// <param name="dataContextType">the data context type of the parent visual.</param> /// <param name="nameSpaceAssemblySearch"></param> /// <param name="visualLineage"></param> /// <param name="applyStyles"></param> /// <returns></returns> private async Task <IVisualElement> GetVisualAsync(IMarkupNode node, Type?dataContextType, Dictionary <String, String> nameSpaceAssemblySearch, IVisualLineage visualLineage, ApplyVisualStyles applyStyles) { var bindings = await _bindingBuilder.GetBindingsDictionaryAsync(node, dataContextType, nameSpaceAssemblySearch); var dataBindings = bindings.Values.OfType <IDataBinding>() .ToArray(); dataContextType = _bindingBuilder.InferDataContextTypeFromBindings(dataBindings, dataContextType); if (!node.TryGetAttributeValue("ContextType", out var currentGenericArgName)) { currentGenericArgName = dataContextType?.Name; } else { dataContextType = _typeInferrer.GetTypeFromClearName(currentGenericArgName, nameSpaceAssemblySearch, true); } var visualType = _visualTypeResolver.GetType(node, currentGenericArgName, nameSpaceAssemblySearch); IVisualElement visual; if (typeof(IContentContainer).IsAssignableFrom(visualType)) { // CONTENT VISUAL visual = await BuildContentVisualAsync(node, dataContextType, nameSpaceAssemblySearch, visualType, visualLineage, applyStyles) .ConfigureAwait(false); } else if (visualType is { } validVisualType) { //------------------------------- visual = _visualBootstrapper.Instantiate <IVisualElement>(validVisualType); //await applyStyles(visual, node, visualLineage, this); //------------------------------- visualLineage.PushVisual(visual); if (node.ChildrenCount > 0) { // PANEL await InflateAndAddChildNodesAsync(node, visual, dataContextType, nameSpaceAssemblySearch, visualLineage, _appliedStyleBuilder.ApplyVisualStylesAsync).ConfigureAwait(false); } if (node.InnerText is { } innerText&& innerText.Trim() is { } validInnerText&& validInnerText.Length > 0 && GetAttribute <ContentPropertyAttribute>(validVisualType) is { } cp&& _typeInferrer.FindPublicProperty(validVisualType, cp.Name) is { } contentProp&& contentProp.PropertyType == typeof(String)) { // zb <Label>hello world</Label> contentProp.SetValue(visual, validInnerText, null); } }