Ejemplo n.º 1
0
        /// <summary>
        /// 查找逻辑:
        /// 先找元数据中的 AutomationPropertyKey
        /// 如果没有,再尝试使用 Title 属性。
        /// 如果没有,再尝试使用 "Name" 属性。
        /// </summary>
        /// <param name="evm"></param>
        /// <returns></returns>
        public static string TryGetPrimayDisplayProperty(this EntityViewMeta evm)
        {
            var autoProperty = TryGetAutomationNameBinding(evm);

            if (autoProperty != null)
            {
                return(autoProperty);
            }

            var title = evm.TitleProperty;

            if (title != null)
            {
                return(title.Name);
            }

            var nameProperty = evm.Property("Name");

            if (nameProperty != null)
            {
                return(nameProperty.Name);
            }

            return(null);
        }
Ejemplo n.º 2
0
        private EntityPropertyViewMeta CreateEntityPropertyViewMeta(IManagedProperty mp, EntityViewMeta evm)
        {
            var item = evm.CreatePropertyViewMeta();
            item.Owner = evm;

            item.PropertyMeta = evm.EntityMeta.Property(mp);

            //如果这个托管属性有对应的 CLR 属性,并且这个 CLR 属性上标记了 Label 标签,则设置元数据的 Label 属性。
            var runtimeProperty = item.PropertyMeta.CLRProperty;
            if (runtimeProperty != null)
            {
                var labelAttri = runtimeProperty.GetSingleAttribute<LabelAttribute>();
                if (labelAttri != null) item.Label = labelAttri.Label;
            }

            item.Readonly(mp.IsReadOnly || mp == EntityConvention.Property_TreeIndex);

            //如果是引用实体的属性,创建 SelectionViewMeta
            if (item.IsReference)
            {
                item.SelectionViewMeta = new SelectionViewMeta();
            }

            evm.EntityProperties.Add(item);

            return item;
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 尝试为 evm 生成一个运行时的 Id,以方便这个没有数据库的类也能运行在 Rafy 界面框架上。
        /// </summary>
        /// <param name="evm"></param>
        /// <returns></returns>
        private static int GetRuntimeUniqueId(EntityViewMeta evm)
        {
            var viewName = evm.ExtendView;
            //if (string.IsNullOrEmpty(viewName)) return evm.EntityMeta.Id;

            var entityType = evm.EntityType;

            var res = _viewIds.FirstOrDefault(i => i.EntityType == entityType && i.ViewName == viewName);

            if (res == null)
            {
                lock (_viewIds)
                {
                    res = _viewIds.FirstOrDefault(i => i.EntityType == entityType && i.ViewName == viewName);
                    if (res == null)
                    {
                        res = new EVMUniqueId
                        {
                            EntityType = entityType,
                            ViewName   = viewName,
                            Id         = RafyEnvironment.NewLocalId()
                        };
                        _viewIds.Add(res);
                    }
                }
            }

            return(res.Id);
        }
Ejemplo n.º 4
0
        public void Config(EntityViewMeta evm)
        {
            if (PageSize != null && evm is WebEntityViewMeta)
            {
                evm.AsWebView().PageSize = PageSize.Value;
            }
            if (GroupBy != null)
            {
                if (GroupBy == NullString)
                {
                    evm.GroupBy = null;
                }
                else
                {
                    evm.GroupBy = evm.Property(GroupBy);
                }
            }

            foreach (var property in this.EntityProperties)
            {
                if (property.IsChanged())
                {
                    var pvm = evm.Property(property.Name);
                    if (pvm != null)
                    {
                        property.Config(pvm);
                    }
                }
            }

            if (RafyEnvironment.Location.IsWebUI)
            {
                foreach (var cmd in this.Commands)
                {
                    if (cmd.IsChanged())
                    {
                        var jsCmd = evm.AsWebView().Commands.Find(cmd.Name);
                        if (jsCmd != null)
                        {
                            cmd.Config(jsCmd);
                        }
                    }
                }
            }
            else
            {
                foreach (var cmd in this.Commands)
                {
                    if (cmd.IsChanged())
                    {
                        var wpfCmd = evm.AsWPFView().Commands.Find(cmd.Name);
                        if (wpfCmd != null)
                        {
                            cmd.Config(wpfCmd);
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
        protected override void UseBlockDefaultCommands(EntityViewMeta meta)
        {
            if (!RafyEnvironment.Location.IsWebUI)
            {
                //如果当前模块是一个条件面板,应该添加上查询按钮。
                meta.AsWPFView().UseCommands(WPFCommandNames.FireQuery);
            }

            base.UseBlockDefaultCommands(meta);
        }
Ejemplo n.º 6
0
        internal static void EntityToJson(EntityViewMeta evm, IEnumerable <Entity> entities, IList <EntityJson> list)
        {
            foreach (var entity in entities)
            {
                var entityJson = new EntityJson();

                EntityToJson(evm, entity, entityJson);

                list.Add(entityJson);
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 表格中某一行在自动化测试中应该以哪个属性来作为“查找属性”。
        /// </summary>
        /// <param name="evm"></param>
        /// <returns></returns>
        public static string TryGetAutomationNameBinding(this EntityViewMeta evm)
        {
            var autoProperty = evm.GetPropertyOrDefault <string>(AutomationPropertyKey);

            if (!string.IsNullOrWhiteSpace(autoProperty))
            {
                return(autoProperty);
            }

            return(null);
        }
Ejemplo n.º 8
0
        internal static void EntityToJson(EntityViewMeta evm, IEnumerable<Entity> entities, IList<EntityJson> list)
        {
            foreach (var entity in entities)
            {
                var entityJson = new EntityJson();

                EntityToJson(evm, entity, entityJson);

                list.Add(entityJson);
            }
        }
Ejemplo n.º 9
0
 internal void Read(EntityViewMeta evm)
 {
     this.Id = GetRuntimeUniqueId(evm);
     if (evm.GroupBy != null) this.GroupBy = evm.GroupBy.Name;
     if (evm is WebEntityViewMeta)
     {
         this.PageSize = evm.AsWebView().PageSize;
     }
     this.EntityType = ClientEntities.GetClientName(evm.EntityType);
     if (!string.IsNullOrEmpty(evm.ExtendView)) this.ViewName = evm.ExtendView;
 }
Ejemplo n.º 10
0
        internal EntityPropertyViewMeta CreateExtensionPropertyViewMeta(IManagedProperty mp, EntityViewMeta evm)
        {
            var epm = evm.EntityMeta.Property(mp);

            var epvm = evm.CreatePropertyViewMeta();
            epvm.Owner = evm;
            epvm.PropertyMeta = epm;

            evm.EntityProperties.Add(epvm);

            return epvm;
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 自动生成树形列表UI
        /// </summary>
        /// <param name="evm"></param>
        /// <param name="listShowInWhere">
        /// 这个表格需要显示在哪个位置。
        /// <remarks>生成引擎根据元数据中各属性定义的显示逻辑来生成列。</remarks>
        /// </param>
        /// <returns></returns>
        public RafyTreeGrid CreateTreeGrid(EntityViewMeta evm, ListShowInWhere listShowInWhere)
        {
            if (evm == null)
            {
                throw new ArgumentNullException("vm");
            }

            //使用TreeGrid作为TreeListControl
            var treeGrid = new RafyTreeGrid
            {
                OnlyGridMode           = !evm.EntityMeta.IsTreeEntity,
                GroupingStyle          = RafyResources.GroupContainerStyle,
                CheckingColumnTemplate = RafyResources.Rafy_MTTG_SelectionColumnTemplate,
                NoDataText             = "没有数据".Translate(),
                CheckingColumnHeader   = "选择".Translate(),
                SummaryRowTitle        = "合计:".Translate(),
                ShowSummaryRow         = GetNeedSummary(evm)
            };

            if (!string.IsNullOrEmpty(evm.Label))
            {
                AutomationProperties.SetName(treeGrid, evm.Label);
            }
            TreeGridRow.SetAutomationProperty(treeGrid, evm.TryGetPrimayDisplayProperty());

            var showInWhere = (ShowInWhere)listShowInWhere;

            //使用list里面的属性生成每一列
            foreach (WPFEntityPropertyViewMeta property in evm.OrderedEntityProperties())
            {
                if (property.CanShowIn(showInWhere))
                {
                    var column = this.TreeColumnFactory.Create(property);

                    treeGrid.Columns.Add(column);
                }
            }

            treeGrid.ApplyTemplate();

            /*********************** 代码块解释 *********************************
             * 表格的设计,与 FocusTrackerAdorner 不兼容,暂时把它排除。
             * 目前,有以下问题:
             * * 表格中横向拖动滚动条时,焦点跟踪框的位置没有更新。
             * * 表格中从一行的编辑框进入另一行某个单元格的编辑时,跟踪框位置没有更新。
             **********************************************************************/
            FocusTrackerAdorner.SetTrackFocusScope(treeGrid, TrackFocusScope.Exclude);

            return(treeGrid);
        }
Ejemplo n.º 12
0
        private static TreeEntityJson ConvertRecur(Entity entity, EntityViewMeta evm)
        {
            var jEntity = new TreeEntityJson();

            EntityJsonConverter.EntityToJson(evm, entity, jEntity);

            foreach (Entity child in entity.TreeChildren)
            {
                var c = ConvertRecur(child, evm);
                jEntity.children.Add(c);
            }

            return(jEntity);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 创建指定自定义块类型对应的视图。
        /// </summary>
        /// <param name="evm"></param>
        /// <param name="customBlockType"></param>
        /// <returns></returns>
        private LogicalView CreateCustomBlockView(EntityViewMeta evm, BlockType customBlockType)
        {
            ICustomViewFactory factory = null;

            if (!this._factories.TryGetValue(customBlockType, out factory))
            {
                throw new InvalidOperationException("还没有注册对应块类型 {" + customBlockType + "} 的视图构造器。请使用 RegisterBlockType 方法注册。");
            }

            var view = factory.CreateView(evm);

            this.OnViewCreated(view);

            return(view);
        }
Ejemplo n.º 14
0
        private static void AddFields(XElement fields, EntityViewMeta meta)
        {
            foreach (WPFEntityPropertyViewMeta property in meta.EntityProperties)
            {
                var label        = FormatPropertyLabel(property);
                var propertyType = property.PropertyMeta.Runtime.PropertyType;

                if (TypeHelper.IsEnumNullable(propertyType))
                {
                    propertyType = typeof(string);
                }

                fields.Add(new XElement(n + "Field", new XAttribute("Name", label),
                                        new XElement(n + "DataField", property.Name),
                                        new XElement(rd + "TypeName", propertyType.FullName)
                                        ));
            }
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 如果当前 Rafy 运行时环境中,已经拥有 UI 层界面的元数据,则获取属性对应的的显示名称,并进行翻译后返回。
        /// 否则,直接返回以下格式的字符串,方便替换:[属性名称]。(服务端一般都没有 UI 层元数据。)
        /// </summary>
        /// <param name="property">The property.</param>
        /// <returns></returns>
        public static string Display(IManagedProperty property)
        {
            if (RafyEnvironment.Location.IsWebUI || RafyEnvironment.Location.IsWPFUI)
            {
                //以线程安全的方式获取最后一次缓存的 View。
                EntityViewMeta safeView  = _lastViewMeta;
                var            ownerType = property.OwnerType;
                if (safeView == null || safeView.EntityType != ownerType)
                {
                    safeView      = UIModel.Views.CreateBaseView(ownerType);
                    _lastViewMeta = safeView;
                }

                string res = null;

                var pvm = safeView.Property(property);
                if (pvm != null)
                {
                    res = pvm.Label;
                }

                //如果是引用 Id 属性没有配置 Label,则尝试使用它对应的引用实体属性的 Label 来显示。
                if (string.IsNullOrEmpty(res))
                {
                    var refMP = property as IRefIdProperty;
                    if (refMP != null)
                    {
                        pvm = safeView.Property(refMP.RefEntityProperty);
                        if (pvm != null)
                        {
                            res = pvm.Label;
                        }
                    }
                }

                if (!string.IsNullOrEmpty(res))
                {
                    return(res.Translate());
                }
            }

            return('[' + property.Name + ']');
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 如果当前 Rafy 运行时环境中,已经拥有 UI 层界面的元数据,则获取实体对应的的显示名称,并进行翻译后返回。
        /// 否则,直接返回以下格式的字符串,方便替换:[实体类型名称]。(服务端一般都没有 UI 层元数据。)
        /// </summary>
        /// <param name="entityType">Type of the entity.</param>
        /// <returns></returns>
        public static string Display(Type entityType)
        {
            if (RafyEnvironment.Location.IsWebUI || RafyEnvironment.Location.IsWPFUI)
            {
                //以线程安全的方式获取最后一次缓存的 View。
                EntityViewMeta safeView  = _lastViewMeta;
                var            ownerType = entityType;
                if (safeView == null || safeView.EntityType != ownerType)
                {
                    safeView      = UIModel.Views.CreateBaseView(ownerType);
                    _lastViewMeta = safeView;
                }

                string res = safeView.Label;
                if (!string.IsNullOrEmpty(res))
                {
                    return(res.Translate());
                }
            }

            return('[' + entityType.FullName + ']');
        }
Ejemplo n.º 17
0
        internal static EntityViewMeta GetEVMByParentId(int parentId)
        {
            EntityViewMeta evm = null;

            var dest = RafyEnvironment.BranchProvider.HasBranch ? BlockConfigType.Customization : BlockConfigType.Config;

            var viewId = TryGetViewUniqueId(parentId);
            if (viewId != null)
            {
                evm = UIModel.Views.Create(viewId.EntityType, viewId.ViewName, dest);
            }
            //else
            //{
            //    var entityMeta = CommonModel.Entities.Find(parentId);
            //    if (entityMeta != null)
            //    {
            //        evm = WebModel.Views.GetDefaultView(entityMeta.EntityType, dest);
            //    }
            //}

            return evm;
        }
Ejemplo n.º 18
0
        /// <summary>
        /// 自动生成树形列表UI
        /// </summary>
        /// <param name="evm"></param>
        /// <param name="listShowInWhere">
        /// 这个表格需要显示在哪个位置。
        /// <remarks>生成引擎根据元数据中各属性定义的显示逻辑来生成列。</remarks>
        /// </param>
        /// <returns></returns>
        public RafyTreeGrid CreateTreeGrid(EntityViewMeta evm, ListShowInWhere listShowInWhere)
        {
            if (evm == null) throw new ArgumentNullException("vm");

            //使用TreeGrid作为TreeListControl
            var treeGrid = new RafyTreeGrid
            {
                OnlyGridMode = !evm.EntityMeta.IsTreeEntity,
                GroupingStyle = RafyResources.GroupContainerStyle,
                CheckingColumnTemplate = RafyResources.Rafy_MTTG_SelectionColumnTemplate,
                NoDataText = "没有数据".Translate(),
                CheckingColumnHeader = "选择".Translate(),
                SummaryRowTitle = "合计:".Translate(),
                ShowSummaryRow = GetNeedSummary(evm)
            };
            if (!string.IsNullOrEmpty(evm.Label))
            {
                AutomationProperties.SetName(treeGrid, evm.Label);
            }
            TreeGridRow.SetAutomationProperty(treeGrid, evm.TryGetPrimayDisplayProperty());

            var showInWhere = (ShowInWhere)listShowInWhere;

            //使用list里面的属性生成每一列
            foreach (WPFEntityPropertyViewMeta property in evm.OrderedEntityProperties())
            {
                if (property.CanShowIn(showInWhere))
                {
                    var column = this.TreeColumnFactory.Create(property);

                    treeGrid.Columns.Add(column);
                }
            }

            treeGrid.ApplyTemplate();

            /*********************** 代码块解释 *********************************
             * 表格的设计,与 FocusTrackerAdorner 不兼容,暂时把它排除。
             * 目前,有以下问题:
             * * 表格中横向拖动滚动条时,焦点跟踪框的位置没有更新。
             * * 表格中从一行的编辑框进入另一行某个单元格的编辑时,跟踪框位置没有更新。
            **********************************************************************/
            FocusTrackerAdorner.SetTrackFocusScope(treeGrid, TrackFocusScope.Exclude);

            return treeGrid;
        }
Ejemplo n.º 19
0
        /// <summary>
        /// 加载所有属性元数据
        /// </summary>
        /// <param name="viewMeta"></param>
        private void CreatePropertiesViewMeta(EntityViewMeta viewMeta)
        {
            foreach (var property in EntityMetaHelper.GetEntityProperties(viewMeta.EntityMeta))
            {
                this.CreateEntityPropertyViewMeta(property, viewMeta);
            }

            //加入扩展属性元数据
            foreach (var mp in EntityMetaHelper.GetEntityPropertiesExtension(viewMeta.EntityMeta))
            {
                this.CreateExtensionPropertyViewMeta(mp, viewMeta);
            }
        }
Ejemplo n.º 20
0
 internal static void SetNeedSummary(EntityViewMeta meta, bool value)
 {
     meta.SetExtendedProperty(BlockUIFactory_NeedSummary, value);
 }
Ejemplo n.º 21
0
        internal void InitViewMeta()
        {
            if (this._ViewMeta == null)
            {
                this._ViewMeta = UIModel.Views.Create(this.EntityType, ViewConfig.GetViewName(this.ExtendView));

                this.UseBlockDefaultCommands(this._ViewMeta);
            }
        }
Ejemplo n.º 22
0
        internal static void EntityToJson(EntityViewMeta evm, Entity entity, EntityJson entityJson)
        {
            var isTree = evm.EntityMeta.IsTreeEntity;

            foreach (var propertyVM in evm.EntityProperties)
            {
                var property = propertyVM.PropertyMeta;
                var mp = property.ManagedProperty;
                if (mp != null)
                {
                    //如果非树型实体,则需要排除树型实体的两个属性。
                    if (!isTree && (mp == Entity.TreeIndexProperty || mp == Entity.TreePIdProperty)) { continue; }

                    //引用属性
                    if (propertyVM.IsReference)
                    {
                        var refMp = mp as IRefProperty;
                        object value = string.Empty;
                        var id = entity.GetRefNullableId(refMp.RefIdProperty);
                        if (id != null) { value = id; }

                        var idName = refMp.RefIdProperty.Name;
                        entityJson.SetProperty(idName, value);

                        //同时写入引用属性的视图属性,如 BookCategoryId_Label
                        if (id != null && propertyVM.CanShowIn(ShowInWhere.List))
                        {
                            var titleProperty = propertyVM.SelectionViewMeta.RefTypeDefaultView.TitleProperty;
                            if (titleProperty != null)
                            {
                                var lazyRefEntity = entity.GetRefEntity(refMp.RefEntityProperty);
                                var titleMp = titleProperty.PropertyMeta.ManagedProperty;
                                if (titleMp != null)
                                {
                                    value = lazyRefEntity.GetProperty(titleMp);
                                }
                                else
                                {
                                    value = ObjectHelper.GetPropertyValue(lazyRefEntity, titleProperty.Name);
                                }

                                var name = EntityModelGenerator.LabeledRefProperty(idName);
                                entityJson.SetProperty(name, value);
                            }
                        }
                    }
                    //一般托管属性
                    else
                    {
                        var pRuntimeType = property.PropertyType;
                        var serverType = ServerTypeHelper.GetServerType(pRuntimeType);
                        if (serverType.Name != SupportedServerType.Unknown)
                        {
                            var value = entity.GetProperty(mp);
                            value = ToClientValue(pRuntimeType, value);
                            entityJson.SetProperty(mp.Name, value);
                        }
                    }
                }
                //一般 CLR 属性
                else
                {
                    var pRuntimeType = property.PropertyType;
                    var serverType = ServerTypeHelper.GetServerType(pRuntimeType);
                    if (serverType.Name != SupportedServerType.Unknown)
                    {
                        var value = ObjectHelper.GetPropertyValue(entity, property.Name);
                        value = ToClientValue(pRuntimeType, value);
                        entityJson.SetProperty(property.Name, value);
                    }
                }
            }
        }
Ejemplo n.º 23
0
        /// <summary>
        /// 创建指定自定义块类型对应的视图。
        /// </summary>
        /// <param name="evm"></param>
        /// <param name="customBlockType"></param>
        /// <returns></returns>
        private LogicalView CreateCustomBlockView(EntityViewMeta evm, BlockType customBlockType)
        {
            ICustomViewFactory factory = null;
            if (!this._factories.TryGetValue(customBlockType, out factory)) throw new InvalidOperationException("还没有注册对应块类型 {" + customBlockType + "} 的视图构造器。请使用 RegisterBlockType 方法注册。");

            var view = factory.CreateView(evm);

            this.OnViewCreated(view);

            return view;
        }
Ejemplo n.º 24
0
 public EntityPropertyViewMeta CreateExtensionPropertyViewMeta(IManagedProperty mp, EntityViewMeta evm)
 {
     return this._codeReader.CreateExtensionPropertyViewMeta(mp, evm);
 }
Ejemplo n.º 25
0
        /// <summary>
        /// 尝试为 evm 生成一个运行时的 Id,以方便这个没有数据库的类也能运行在 Rafy 界面框架上。
        /// </summary>
        /// <param name="evm"></param>
        /// <returns></returns>
        private static int GetRuntimeUniqueId(EntityViewMeta evm)
        {
            var viewName = evm.ExtendView;
            //if (string.IsNullOrEmpty(viewName)) return evm.EntityMeta.Id;

            var entityType = evm.EntityType;

            var res = _viewIds.FirstOrDefault(i => i.EntityType == entityType && i.ViewName == viewName);
            if (res == null)
            {
                lock (_viewIds)
                {
                    res = _viewIds.FirstOrDefault(i => i.EntityType == entityType && i.ViewName == viewName);
                    if (res == null)
                    {
                        res = new EVMUniqueId
                        {
                            EntityType = entityType,
                            ViewName = viewName,
                            Id = RafyEnvironment.NewLocalId()
                        };
                        _viewIds.Add(res);
                    }
                }
            }

            return res.Id;
        }
Ejemplo n.º 26
0
 internal void Read(EntityViewMeta evm)
 {
     this.Id = GetRuntimeUniqueId(evm);
     if (evm.GroupBy != null) this.GroupBy = evm.GroupBy.Name;
     if (evm is WebEntityViewMeta)
     {
         this.PageSize = evm.AsWebView().PageSize;
     }
     this.EntityType = ClientEntities.GetClientName(evm.EntityType);
     if (!string.IsNullOrEmpty(evm.ExtendView)) this.ViewName = evm.ExtendView;
 }
Ejemplo n.º 27
0
 /// <summary>
 /// 定义列到属性的映射。
 /// </summary>
 /// <param name="properties">
 /// Key:列名,将会使用这个列名来显示。
 /// Value:列名在对象中所对应的属性名。
 /// </param>
 protected virtual void DefineTable(List<WPFEntityPropertyViewMeta> properties, EntityViewMeta evm)
 {
     foreach (WPFEntityPropertyViewMeta property in evm.OrderedEntityProperties())
     {
         if (property.CanShowIn(ShowInWhere.List))
         {
             properties.Add(property);
         }
     }
 }
Ejemplo n.º 28
0
 internal static void SetNeedSummary(EntityViewMeta meta, bool value)
 {
     meta.SetExtendedProperty(BlockUIFactory_NeedSummary, value);
 }
Ejemplo n.º 29
0
 /// <summary>
 /// 获取一个列表视图是否需要显示合计行。
 /// </summary>
 /// <param name="meta"></param>
 /// <returns></returns>
 public static bool GetNeedSummary(EntityViewMeta meta)
 {
     return meta.GetPropertyOrDefault<bool>(BlockUIFactory_NeedSummary);
 }
Ejemplo n.º 30
0
 /// <summary>
 /// 定义列到属性的映射。
 /// </summary>
 /// <param name="properties">
 /// Key:列名,将会使用这个列名来显示。
 /// Value:列名在对象中所对应的属性名。
 /// </param>
 protected virtual void DefineTable(List <WPFEntityPropertyViewMeta> properties, EntityViewMeta evm)
 {
     foreach (WPFEntityPropertyViewMeta property in evm.OrderedEntityProperties())
     {
         if (property.CanShowIn(ShowInWhere.List))
         {
             properties.Add(property);
         }
     }
 }
Ejemplo n.º 31
0
        private void ReplaceControl(EntityViewMeta evm)
        {
            var newControl = AutoUI.BlockUIFactory.CreateTreeGrid(evm, ListShowInWhere.List);

            this._view.ReplaceControl(newControl);
        }
Ejemplo n.º 32
0
 private void UseSysCommands(EntityViewMeta evm)
 {
     //初始化实体视图中的命令按钮
     var em = evm.EntityMeta;
     if (!RafyEnvironment.Location.IsWebUI)
     {
         if (em.EntityCategory == EntityCategory.QueryObject)
         {
             evm.AsWPFView().UseCommands(WPFCommandNames.SysQueryCommands);
         }
         else
         {
             evm.AsWPFView().UseCommands(WPFCommandNames.SysCommands);
         }
     }
     else
     {
         if (em.EntityCategory == EntityCategory.QueryObject)
         {
             evm.AsWebView().UseCommands(WebCommandNames.SysQueryCommands);
         }
         else
         {
             evm.AsWebView().UseCommands(WebCommandNames.SysCommands);
         }
     }
 }
Ejemplo n.º 33
0
        /// <summary>
        /// 如果当前 Rafy 运行时环境中,已经拥有 UI 层界面的元数据,则获取属性对应的的显示名称,并进行翻译后返回。
        /// 否则,直接返回以下格式的字符串,方便替换:[属性名称]。(服务端一般都没有 UI 层元数据。)
        /// </summary>
        /// <param name="property">The property.</param>
        /// <returns></returns>
        public static string Display(IManagedProperty property)
        {
            if (RafyEnvironment.Location.IsWebUI || RafyEnvironment.Location.IsWPFUI)
            {
                //以线程安全的方式获取最后一次缓存的 View。
                EntityViewMeta safeView = _lastViewMeta;
                var ownerType = property.OwnerType;
                if (safeView == null || safeView.EntityType != ownerType)
                {
                    safeView = UIModel.Views.CreateBaseView(ownerType);
                    _lastViewMeta = safeView;
                }

                string res = null;

                var pvm = safeView.Property(property);
                if (pvm != null) res = pvm.Label;

                //如果是引用 Id 属性没有配置 Label,则尝试使用它对应的引用实体属性的 Label 来显示。
                if (string.IsNullOrEmpty(res))
                {
                    var refMP = property as IRefIdProperty;
                    if (refMP != null)
                    {
                        pvm = safeView.Property(refMP.RefEntityProperty);
                        if (pvm != null) res = pvm.Label;
                    }
                }

                if (!string.IsNullOrEmpty(res))
                {
                    return res.Translate();
                }
            }

            return '[' + property.Name + ']';
        }
Ejemplo n.º 34
0
 /// <summary>
 /// 获取一个列表视图是否需要显示合计行。
 /// </summary>
 /// <param name="meta"></param>
 /// <returns></returns>
 public static bool GetNeedSummary(EntityViewMeta meta)
 {
     return(meta.GetPropertyOrDefault <bool>(BlockUIFactory_NeedSummary));
 }
Ejemplo n.º 35
0
 private void owner_PropertyFound(object sender, EntityViewMeta.PropertyFoundEventArgs e)
 {
     var item = e.Property as WPFEntityPropertyViewMeta;
     if (!this.Properties.Contains(item))
     {
         this.Properties.Add(item);
     }
 }
Ejemplo n.º 36
0
        internal static void EntityToJson(EntityViewMeta evm, Entity entity, EntityJson entityJson)
        {
            var isTree = evm.EntityMeta.IsTreeEntity;

            foreach (var propertyVM in evm.EntityProperties)
            {
                var property = propertyVM.PropertyMeta;
                var mp       = property.ManagedProperty;
                if (mp != null)
                {
                    //如果非树型实体,则需要排除树型实体的两个属性。
                    if (!isTree && (mp == Entity.TreeIndexProperty || mp == Entity.TreePIdProperty))
                    {
                        continue;
                    }

                    //引用属性
                    if (propertyVM.IsReference)
                    {
                        var    refMp = mp as IRefProperty;
                        object value = string.Empty;
                        var    id    = entity.GetRefNullableId(refMp.RefIdProperty);
                        if (id != null)
                        {
                            value = id;
                        }

                        var idName = refMp.RefIdProperty.Name;
                        entityJson.SetProperty(idName, value);

                        //同时写入引用属性的视图属性,如 BookCategoryId_Display
                        if (id != null && propertyVM.CanShowIn(ShowInWhere.List))
                        {
                            var titleProperty = propertyVM.SelectionViewMeta.RefTypeDefaultView.TitleProperty;
                            if (titleProperty != null)
                            {
                                var lazyRefEntity = entity.GetRefEntity(refMp.RefEntityProperty);
                                var titleMp       = titleProperty.PropertyMeta.ManagedProperty;
                                if (titleMp != null)
                                {
                                    value = lazyRefEntity.GetProperty(titleMp);
                                }
                                else
                                {
                                    value = ObjectHelper.GetPropertyValue(lazyRefEntity, titleProperty.Name);
                                }

                                var name = EntityModelGenerator.LabeledRefProperty(idName);
                                entityJson.SetProperty(name, value);
                            }
                        }
                    }
                    //一般托管属性
                    else
                    {
                        var pRuntimeType = property.PropertyType;
                        var serverType   = ServerTypeHelper.GetServerType(pRuntimeType);
                        if (serverType.Name != SupportedServerType.Unknown)
                        {
                            var value = entity.GetProperty(mp);
                            value = ToClientValue(pRuntimeType, value);
                            entityJson.SetProperty(mp.Name, value);
                        }
                    }
                }
                //一般 CLR 属性
                else
                {
                    var pRuntimeType = property.PropertyType;
                    var serverType   = ServerTypeHelper.GetServerType(pRuntimeType);
                    if (serverType.Name != SupportedServerType.Unknown)
                    {
                        var value = ObjectHelper.GetPropertyValue(entity, property.Name);
                        value = ToClientValue(pRuntimeType, value);
                        entityJson.SetProperty(property.Name, value);
                    }
                }
            }
        }
Ejemplo n.º 37
0
        /// <summary>
        /// 如果当前 Rafy 运行时环境中,已经拥有 UI 层界面的元数据,则获取实体对应的的显示名称,并进行翻译后返回。
        /// 否则,直接返回以下格式的字符串,方便替换:[实体类型名称]。(服务端一般都没有 UI 层元数据。)
        /// </summary>
        /// <param name="entityType">Type of the entity.</param>
        /// <returns></returns>
        public static string Display(Type entityType)
        {
            if (RafyEnvironment.Location.IsWebUI || RafyEnvironment.Location.IsWPFUI)
            {
                //以线程安全的方式获取最后一次缓存的 View。
                EntityViewMeta safeView = _lastViewMeta;
                var ownerType = entityType;
                if (safeView == null || safeView.EntityType != ownerType)
                {
                    safeView = UIModel.Views.CreateBaseView(ownerType);
                    _lastViewMeta = safeView;
                }

                string res = safeView.Label;
                if (!string.IsNullOrEmpty(res))
                {
                    return res.Translate();
                }
            }

            return '[' + entityType.FullName + ']';
        }
Ejemplo n.º 38
0
 /// <summary>
 /// 使用本块中默认的一些按钮。
 /// </summary>
 protected virtual void UseBlockDefaultCommands(EntityViewMeta meta)
 {
     if (RafyEnvironment.Location.IsWPFUI)
     {
         if (this.BlockType == BlockType.Report)
         {
             meta.AsWPFView().UseCommands(WPFCommandNames.RefreshDataSourceInRDLC, WPFCommandNames.ShowReportData);
         }
     }
 }
Ejemplo n.º 39
0
 /// <summary>
 /// 设置自动化测试中的需要绑定的“查找属性”名。
 /// </summary>
 /// <typeparam name="TEntity"></typeparam>
 /// <param name="meta"></param>
 /// <param name="propertyExp"></param>
 public static void SetAutomationNameBinding(
     this EntityViewMeta meta, IManagedProperty property
     )
 {
     meta.SetExtendedProperty(AutomationPropertyKey, property.Name);
 }
Ejemplo n.º 40
0
        public void Config(EntityViewMeta evm)
        {
            if (PageSize != null && evm is WebEntityViewMeta) evm.AsWebView().PageSize = PageSize.Value;
            if (GroupBy != null)
            {
                if (GroupBy == NullString)
                {
                    evm.GroupBy = null;
                }
                else
                {
                    evm.GroupBy = evm.Property(GroupBy);
                }
            }

            foreach (var property in this.EntityProperties)
            {
                if (property.IsChanged())
                {
                    var pvm = evm.Property(property.Name);
                    if (pvm != null) { property.Config(pvm); }
                }
            }

            if (RafyEnvironment.Location.IsWebUI)
            {
                foreach (var cmd in this.Commands)
                {
                    if (cmd.IsChanged())
                    {
                        var jsCmd = evm.AsWebView().Commands.Find(cmd.Name);
                        if (jsCmd != null) { cmd.Config(jsCmd); }
                    }
                }
            }
            else
            {
                foreach (var cmd in this.Commands)
                {
                    if (cmd.IsChanged())
                    {
                        var wpfCmd = evm.AsWPFView().Commands.Find(cmd.Name);
                        if (wpfCmd != null) { cmd.Config(wpfCmd); }
                    }
                }
            }
        }
Ejemplo n.º 41
0
        private JsonModel QueryEntityList(HttpRequest request, EntityViewMeta evm)
        {
            var repo = RF.Find(evm.EntityType);

            var pagingInfo = ParsePagingInfo(request, repo);

            var entities = QueryEntityListCore(request, repo, pagingInfo);

            var list = new EntityJsonList {
                model = evm.EntityType
            };

            if (repo.SupportTree)
            {
                var roots = entities;
                foreach (var rootItem in roots)
                {
                    var i = ConvertRecur(rootItem, evm);
                    i.expanded = true;
                    list.entities.Add(i);
                }

                list.total = (entities as ITreeComponent).CountNodes();
            }
            else
            {
                //如果此时,还需要进行统计,表示在数据层查询时,并没有对分页进行处理。这时,只能在内存中对实体进行分页。
                if (pagingInfo.IsNeedCount)
                {
                    entities = JumpToPageInMemory(repo, entities, pagingInfo);
                }

                EntityJsonConverter.EntityToJson(evm, entities, list.entities);

                list.total = pagingInfo.TotalCount;
            }

            return(list);

            #region //暂时不用

            //var repo = RF.Create(evm.EntityType);

            //EntityList entities = QueryEntityListCore(request, repo);

            //if (repo.SupportTree)
            //{
            //    entities.EnsureObjectRelations();

            //    var root = new RootTreeEntityJson();

            //    var roots = entities.FindRoots();
            //    foreach (var rootItem in roots)
            //    {
            //        var i = ConvertRecur(rootItem, evm);
            //        root.children.Add(i);
            //    }

            //    return root;
            //}
            //else
            //{
            //    var page = request.GetQueryStringOrDefault("page", 1);
            //    var limit = request.GetQueryStringOrDefault("limit", 10);
            //    var pagerInfo = new PagerInfo(page, limit, true);
            //    entities = JumpToPage(repo, entities, pagerInfo);

            //    var list = new EntityJsonList
            //    {
            //        totalCount = pagerInfo.TotalCount,
            //    };

            //    EntityJsonConverter.EntityToJson(evm, entities, list.entities);

            //    return list;
            //}

            #endregion
        }