public virtual ICellTemplate CreateTemplate(XNode cellNode, EntityMetadata entityMetadata)
        {
            if (!IsInitialized)
            {
                throw new InvalidOperationException("Factory is not initialized.");
            }

            var cellMetadata = MetadataFactory.GetMetadata(cellNode, entityMetadata, LanguageCode);

            if (cellMetadata.HasAttributeType("boolean"))
            {
                return(new BooleanControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.HasAttributeType("datetime"))
            {
                return(new DateTimeControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.HasAttributeType("integer"))
            {
                return(new IntegerControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.HasAttributeType("memo"))
            {
                return(new MemoControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.HasAttributeType("picklist"))
            {
                return(new PicklistControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.HasAttributeType("string"))
            {
                if (string.Equals("email", cellMetadata.Format, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(new EmailStringControlTemplate(cellMetadata, ValidationGroup, CellBindings));
                }

                return(new StringControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.HasAttributeType("money"))
            {
                return(new MoneyControlTemplate(cellMetadata, ValidationGroup, CellBindings));
            }

            if (cellMetadata.AttributeType == null)
            {
                return(new EmptyCellTemplate());
            }

            return(new UnsupportedControlTemplate(cellMetadata, ValidationGroup, CellBindings, EnableUnsupportedFields));
        }
        /// <summary>
        /// Method to create the cell template.
        /// </summary>
        /// <param name="cellNode"></param>
        /// <param name="entityMetadata"></param>
        /// <returns></returns>
        /// <exception cref="InvalidOperationException"></exception>
        /// <exception cref="ApplicationException"></exception>
        public override ICellTemplate CreateTemplate(System.Xml.Linq.XNode cellNode, Microsoft.Xrm.Sdk.Metadata.EntityMetadata entityMetadata)
        {
            if (!IsInitialized)
            {
                throw new InvalidOperationException("Factory is not initialized.");
            }

            ICellMetadata cellMetadata;

            if (MetadataFactory is FormXmlCellMetadataFactory)
            {
                var formMetadataFactory = MetadataFactory as FormXmlCellMetadataFactory;

                cellMetadata = formMetadataFactory.GetMetadata(cellNode, entityMetadata, LanguageCode, ToolTipEnabled, RecommendedFieldsRequired, ValidationText, WebFormMetadata, ForceAllFieldsRequired, EnableValidationSummaryLinks, ValidationSummaryLinkText, Messages, BaseOrganizationLanguageCode);
            }
            else
            {
                cellMetadata = MetadataFactory.GetMetadata(cellNode, entityMetadata, LanguageCode);
            }

            return(CreateCellTemplate(cellMetadata, entityMetadata));
        }