信息系统开发平台OpenExpressApp - 支持列表分组(Group)

  在《内置支持的列表编辑方式》中介绍了OpenExpressApp内置的列表编辑方式。由于在列表显示过程中,经常会遇到需要分组显示的需求,所以OEA也内置了列表分组功能(暂时还不支持多对象树分组),与框架结合起来,完成这个功能更简单友好。本篇介绍一下OEA对列表分组的支持。

界面

  设置分组后,AutoUI自动生成如下所示界面:每一组之上显示一条记录,左边为上下箭头,点击后可以展开和折叠分组的内容,右边显示分组依据属性和当前分组的条目数目。

类库编写

  只需要在显示对象类型定义的BusinessObjectAttribute加上属性PropertyGroup,系统支持多个分组, 属性值为一个带分隔符‘;’的属性名称字符串列表,AutoUI会自动根据分组属性来构建列表界面,显示结果如上图所示,以下为代码片段:

 

    [BusinessObject(ModuleType = ModuleType.List, PropertyGroup= "ProjectName"), Label("清单查询")]
   
public partial class SingleBq : GBusinessBase<SingleBq>
    {
        public string ProjectName
        {
            
get
            {
               
return ProjectInfo.Name;
            }
        }
        
    }

 

分组样式文件

  参考了《WPF - DataGrid 相关收集》中的WPF DataGrid Practical Examples,这个例子列举了很多微软DataGrid的使用,分组是参考Style完全版的那个页面中的Group样式而完成的。如果想学习这个,大家必须先对样式文件、WPF的分组有所了解,网上这类文章也很多,这里也不重复了。以下为样式:

 

Code

OpenExpressApp对分组支持的实现

  1. 元信息支持分组支持
        [AttributeUsage(AttributeTargets.Class)]
        
    public class BusinessObjectAttribute : Attribute
        {
            
    //默认分组
            public string PropertyGroup getset; }
            
        }
  2. 业务模型增加GroupDescriptions  
        /// <summary>
        
    /// 业务对象模型
        
    /// </summary>
        public class BusinessObjectInfo
        {
            
    /// 默认分组属性值
            public string[] GroupDescriptions;

            
    public BusinessObjectInfo(Type boType)
            {
                
    this.BOType = boType;
                BusinessObjectAttribute 
    = boType.GetSingleAttribute<BusinessObjectAttribute>();

                
    if (!String.IsNullOrEmpty(BusinessObjectAttribute.PropertyGroup))
                    GroupDescriptions 
    = BusinessObjectAttribute.PropertyGroup.Split(';');
                
            }
        }     

  3. 把上面的样式存为文件Resource.xaml在系统模块ExpressAppWPFModule的初始化方法中增加装载样式文件,代码如下:
                resouceDic = Application.LoadComponent(new Uri("OpenExpressApp.Module.WPF;component/Resources/Resource.xaml", UriKind.Relative)) as ResourceDictionary;
                Application.Current.Resources.MergedDictionaries.Insert(
    0, resouceDic);
  4. 增加以前的AutoUI.CreateListControl代码,设置GroupStyle
          public static object CreateListControl(Type boType, ListObjectView view)
            {
                DataGrid dg 
    = new SelectionDataGrid()
                    {
                        CanUserAddRows 
    = false,
                        AutoGenerateColumns 
    = false,
                        VerticalGridLinesBrush 
    = new SolidColorBrush(Colors.Gray),
                        HorizontalGridLinesBrush 
    = new SolidColorBrush(Colors.Gray),
                    };
                GroupStyle gs 
    = new GroupStyle();
                gs.ContainerStyle 
    = Application.Current.TryFindResource("GroupContainerStyle"as Style;
                dg.GroupStyle.Add(gs);
         ...
       }
  5. 修改ListEditor.OnSetData,设置collectionView.GroupDescriptions
            public virtual void OnSetData()
            {
                ICollectionView collectionView 
    = CollectionViewSource.GetDefaultView(View.Data);
                
    if (null != collectionView)
                {
                    
    string[] groups = ApplicationModel.GetBusinessObjectInfo(BOType).GroupDescriptions;
                    
    if (null != groups)
                    {
                        
    foreach (string propertyName in groups)
                            collectionView.GroupDescriptions.Add(
    new PropertyGroupDescription(propertyName));
                    }
                }
                dg.ItemsSource 
    = collectionView;
            }

更多内容: 开源信息系统开发平台之OpenExpressApp框架.pdf

posted on 2009-11-25 20:07  周 金根  阅读(1717)  评论(2编辑  收藏

导航