程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 信息系統開發平台OpenExpressApp - 支持勾選視圖

信息系統開發平台OpenExpressApp - 支持勾選視圖

編輯:關於.NET

在OpenExpressApp中部門+崗位=角色,功能權限屬於角色的,所以功能權限也放在部門模塊中設置了,後期將會單獨對權限部門進行介紹,本篇講解一下在功能權限實現中使用到的一種新的內置視圖樣式,我把它叫做勾選視圖。

之前的列表視圖

OEA的所有Command都有一個Guid,角色下功能權限下存儲的實際上是不能使用的功能的Guid,如果按照以往來實現,界面如下:

界面左邊為模塊,右邊為分組的對象功能列表,這時可以通過設計一個【選擇】功能,彈出一個對話框,對話框顯示所有模塊的所有對象功能列表,然後通過選擇後加入細表。雖然這樣可以很方便的使用以前框架的功能來實現,但是用戶使用起來會很不方便。這種方式,勾選一個功能需要需要點擊彈出對話框,然後選擇一些內容,然後關閉。而系統模塊功能可能很多,這樣操作就會讓用戶點擊按鈕多次。  

新增的勾選視圖

勾選視圖界面顯示如上圖所示,右邊把原來彈出的對話框內容顯示在這裡,前面加了一個checkbox框提供選擇,通過勾選操作來實現以往的選擇功能。現在用戶新增或者去除一個功能,只需要勾選一次就可以解決,而以往操作需要3個步驟。

之前項目任務中就遇到過類似操作,當時就想實現一個通用視圖來提高易用性,不過由於時間原因沒有做,直到今天才完成。下面介紹一下勾選視圖的主要實現和使用。

為了下面講解時對數據說明清楚,定義一下兩個術語:

源數據:勾選的列表,相當於以前彈出選擇框的數據

目的數據:操作的對象列表,通過勾選操作影響到的實際對象

實現要求

由於這只是操作樣式不一樣,所以我不希望在以前的業務對象類庫裡加入這部分功能 ,這部分功能與類庫隔離開來

把這個功能抽象為一中通用的樣式視圖,通過一些屬性設置和約定來實現

延用以前框架代碼,在之前框架代碼上擴展

框架內部實現

UI

勾選列表是一個列表視圖,所以可以重用以前的ListObjectView,只是需要增加一個checkbox列。現在實現為通過附加屬性來實現

public static readonly DependencyProperty IsCheckedProperty =
       DependencyProperty.RegisterAttached("IsChecked", typeof(bool), typeof(SelectedDataAttached),
         new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIsCheckedChanged)));
     /// <summary>
     /// Handles changes to the IsChecked property.
     /// </summary>
     private static void OnIsCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
       if (d is DataGrid)
       {
         DataGrid grid = d as DataGrid;
         if ((bool)e.NewValue)
         {
           DataGridCheckBoxColumn column = new DataGridCheckBoxColumn() { Header = "選擇" };
           column.Binding = new Binding(PropertyConvention.IsSelected);
           grid.Columns.Insert(0, column);
         }
         else
         {
           if ((grid.Columns[0] is DataGridCheckBoxColumn) && ((string)grid.Columns[0].Header == "選擇"))
             grid.Columns.RemoveAt(0);
         }
       }
     }

數據

以前UI顯示的數據是父對象的子對象列表屬性(目的數據),現在需要顯示為源數據,則需要修改LoadData,

/// <summary>
     /// 裝載數據,考慮(AssociationOperateType.Selected
     /// </summary>
     public override void LoadData()
     {
       base.LoadData();
       if ((AllowLoadData) && (AssociationOperateType.Selected == BOsPropInfo.AssociationAttribute.AssociationOperateType))
       {
         LateBoundObject obj = new LateBoundObject(_data);
         Data = obj.CallMethod(MethodConvention.GetList_Selected);
         _destData = this.Parent.CurrentObject.GetPropertyValue(PropertyName);
         (Control as UIElement).SetValue(SelectedDataAttached.DestDataProperty, _destData);
       }
     }

對於通過本地導航獲取數據的,需要修改FilterData

/// <summary>
     /// 導航過濾數據
     /// </summary>
     /// <param name="queryObject"></param>
     public void FilterData(IQueryObject queryObject)
     {
       _data = this.Parent.CurrentObject.GetPropertyValue(PropertyName);
       LateBoundObject obj = new LateBoundObject(_data);
       if (AssociationOperateType.Self == BOsPropInfo.AssociationAttribute.AssociationOperateType)
         Data = obj.CallMethod(MethodConvention.GetList, queryObject);
       else
       {
         Data = obj.CallMethod(MethodConvention.GetList_Selected, queryObject);
         _destData = obj.CallMethod(MethodConvention.GetList, queryObject);
         (Control as UIElement).SetValue(SelectedDataAttached.DestDataProperty, _destData);
       }
     }

操作

勾選時需要觸發增加或者刪除目的數據對象,通過在給View的Data賦值時遍歷源數據每條記錄的INotifyPropertyChanged事件來處理  

foreach (var srcItem in srcData)
         {
           //屬性更改觸發新增刪除對象
           (srcItem as INotifyPropertyChanged).PropertyChanged += delegate(object sender, PropertyChangedEventArgs pe)
           {
             if (pe.PropertyName.ToLower() == PropertyConvention.IsSelected.ToLower())
             {
               bool isSelected = (bool)sender.GetPropertyValue(PropertyConvention.IsSelected);
               if (view.BOsPropInfo.AssociationAttribute.IsForwardSelected) //正向
               {
                 if (isSelected)
                   AddObject(sender, destData, view);
                 else
                   DeleteObject(sender, destData, view);
               }
               else //反向
               {
                 if (isSelected)
                   DeleteObject(sender, destData, view);
                 else
                   AddObject(sender, destData, view);
               }
             }
           };
         }

外部開發使用

設置Association屬性

private static PropertyInfo<OrgPositionOperations> OrgPositionOperationsProperty =
RegisterProperty(new PropertyInfo<OrgPositionOperations>("OrgPositionOperations"));
     [Association(AssociationOperateType = AssociationOperateType.Selected, IsForwardSelected =false, SelectedPropertyMap = "BusinessObjectId;OperationId")]
     public OrgPositionOperations OrgPositionOperations
     {
       get
       {
         if (!FieldManager.FieldExists(OrgPositionOperationsProperty))
         {
           LoadProperty(OrgPositionOperationsProperty, OrgPositionOperations.NewChild());
         }
         return GetProperty(OrgPositionOperationsProperty);
       }
     }

在Association屬性中設置三個屬性:

AssociationOperateType = AssociationOperateType.Selected

關聯操作類型,設置為Selected表示使用勾選視圖,如果你把值設置為Self,或者不設置此值,那麼顯示結果就切換到最上面那個圖了

IsForwardSelected =false

決定勾選check值觸發添加記錄還是刪除記錄,如果為true,表示正向操作,勾選時則新增對象,去除勾選時則刪除對象,如果為false,則相反

SelectedPropertyMap = "BusinessObjectId;OperationId"

在勾選操作導致新增對象時,需要給新增對象的一些屬性賦值,這些屬性值來源於選擇列表對象的屬性,通過這個屬性來映射。格式為:列表屬性1=子對象屬性1;列表屬性2=子對象屬性2,如果沒有=號,表示兩個屬性名稱相同

實現選擇適配類

選擇類如下,同以往業務類類似,屬性比以往彈出選擇列表對象類相似,唯一差別就是增加了一個IsSelected屬性,參考代碼如下:

public partial class BoInfoOperationSelectedList : GBusinessListBase<BoInfoOperationSelectedList, BoInfoOperationSelected>
   {... }
   [Serializable]
   [BusinessObject("2F1C87E1-8067-49b5-918C-230038AFA1F7", PropertyGroup = "ObjectName"), Label("對象功能")]
   public partial class BoInfoOperationSelected : GBusinessBase<BoInfoOperationSelected>
   { 
     ...
     private static PropertyInfo<bool> IsSelectedProperty =
       RegisterProperty(new PropertyInfo<bool>("IsSelected"));
     [EntityProperty]
     [ShowInList, Label("選擇"), ShowInLookup]
     public bool IsSelected
     {
       get { return GetProperty(IsSelectedProperty); }
       set { SetProperty(IsSelectedProperty, value); }
     }
     ...
   }

GetList_Selected方法

當系統從AssociationOperateType獲知是勾選視圖時,系統通過約定的一個方法GetList_Selected來獲取源數據,如果有導航則通過方法參數來匹配導航類,參考代碼如下: 

/// <summary>
     /// 采用選擇操作對象模式時, 選擇列表過濾後數據, 匹配LocalFilter
     /// </summary>
     /// <param name="criteria"></param>
     /// <returns></returns>
     public BoInfoOperationSelectedList GetList_Selected(OrgPositionOperationCriteria criteria)
     {
       return BoInfoOperationSelectedList.GetAggregationteList(criteria.BusinessObjectInfo);
     }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved