XAF應用開發教程(六)控制器


是的,XAF也是MVC結構的,但不僅限於MVC,ViewModel也存在,它是一項復合技術,AOP,ORM,MVC都有。

真實運行的系統中,僅有增刪改查功能肯定是遠遠不夠的,ERP、CRM等系統的開發中,有無數的業務邏輯,通常這些都是在控制器中實現的,控制器有兩種:

ViewController:應用於視圖,需要操作視圖的數據。

WindowsController:應用於窗口,比如當前界面還沒有視圖,與具體視圖也沒有關系,比如登出系統按鈕,不用考慮當前在哪個視圖下面都可以做些操作。

需求:為客戶類填加審核操作。

第一步,我們需要為客戶類填加一個屬性,即,已審核:

找到客戶.cs類:

public class 客戶.....
{
.............
private bool _已審核; [ModelDefault("AllowEdit","False")] public bool 已審核 { get { return _已審核; } set { SetPropertyValue("已審核", ref _已審核, value); } }
.............
}

這里,使用了新的Attribute,ModelDefault,它是讓已審核這個屬性在界面上是只讀的,因為我們想用控制器控制些屬性的值,所以將其禁止修改,改為按鈕控制。

 

 

第二步,創建視圖控制器:

如下所示,在解決方案中找到XCRMDemo.Module項目,展開,找到Controllers文件夾,右鍵->添加->新建項.

當然,是不是放到Controllers文件夾都是可以的,也可以自己按業務情況新建文件夾:

然后出現:

在名稱處輸入CheckViewController.cs

創建完成后,並不上像上圖一樣,有一個審核按鈕,需要從工具箱中拖一個SimpleAction到空白區域。

選中新拖過來的按鈕,並按下F4查看屬性窗口,這里就與普通的窗體程序一樣的界面了。

如圖所示,將3處都修改一下。

在屬性欄中找到閃電圖標,找到Execute並雙擊。

        private void 審核_Execute(object sender, SimpleActionExecuteEventArgs e)
        {
            var x = this.View.CurrentObject as 客戶;
            x.已審核 = true;
            ObjectSpace.CommitChanges();
        }

可以看到有一個事件是空白的,敲入上述代碼。

按下F5查看效果:

打開一條已有的記錄,可以看到,已審核前面的checkbox已經不可以點了,而且在工具欄中已經有了一個”審核”按鈕。

按下審核按鈕后,界面上的已審核checkbox也會打上勾。

而且,完成后,不要點保存按鈕,直接點擊左側導航中的客戶信息,來到列表中,可以看到數據已經保存了。

下面我們來看一下寫的那三行代碼:

            var x = this.View.CurrentObject as 客戶; //this代表了當前控制器,View是當前控制器所生效的視圖,CurrentObject是指當前操作的數據對象。因為當前是在詳細視圖下面,CurrentObject就是指打開的那條記錄了。但是因為這個變量是通用的,所以為Object類型,我們可以轉換為客戶類。 x.已審核 = true;//轉換完成后,就可以對屬性值變更了。 ObjectSpace.CommitChanges();//ObjectSpace在控制器中是一個IObjectSpace接口類型,因為XAF會支持EF/XPO所以ObjectSpace的實例是XAF控制的
簡單的理解ObjectSpace就是對象的總控制對象,比如新建,刪除,查詢,都是通過它來進行,就像是直接在操作數據庫,但是對象比庫結構復雜,比如還方含方法、事件等編程元素在里面,所以它看起來比數據庫功能強大多了。
這里調用了
ObjectSpace.CommitChanges()即為提交變更的內容。
當然如果不寫這句,界面上也會發生變化,只是沒有保存,需要保存時,我們可以再按下保存按鈕。


實現自定義上下文

在驗證規則一節中的規則有上下文的概念,即,某些規則只在某個操作執行才被執行,我們上面增加了審核按鈕,希望客戶信息僅在審核時才為必填:
第一步,增加驗證規則:
public class 客戶.....
{
................
private DateTime _出生日期; [RuleRequiredField("審核時必填出生日期","審核")] public DateTime 出生日期 { get { return _出生日期; } set { SetPropertyValue("出生日期", ref _出生日期, value); } }
................
}

可以看到,[RuleRequiredField("審核時必填出生日期","審核")] 中,第一個參數是規則的名稱,第二個參數是生效上下文的名稱,此時這個上下文是不存的。

下圖展示如何創建上下文:

打開xafml文件,展開ActionDesign->Actions->點擊審核按鈕,在右鍵屬性中找到ValidationContexts,輸入“審核“

F5運行項目,新建客戶信息,不輸入任何內容,直接按下審核按鈕:

可以看到出生日期上面的驗證規則生效了,而姓名必填規則沒有觸發。
問題:姓名也是需要必填的,怎么能讓保存時執行驗證,審核時也執行驗證呢?
很簡單,讓審核按鈕具有兩種上下文環境就可以了:

效果:

你也許看到了,審核按鈕好象在哪里都有,有客戶列表上出現並點擊時,還會報錯。這是因為這個按鈕是有生效位置限制的,我們制作時僅是希望它能在客戶的詳細視圖中顯示,但現在卻哪里能看到,好,下面我們來處理一下:

打開CheckViewController的設置界面,查看按鈕的屬性窗口,進行如下設置:

其中,TargetOjectType是指在哪種類型上面生效,TargetViewType是指哪種視圖類型,選擇為DetailView后,只能在DetailView中看到審核按鈕了。

下面再說說這些屬性都是做什么的:
1.Name,是指生成按鈕的代碼中的名稱。
2.ActionMeaning,是指按鈕在對話框中生效時,代表的是什么意義,有 Unknown無意義,Accept接受,相當於OK按鈕,Cancel,相當於取消按鈕。
3.Caption,按鈕顯示的文字
4.Category,按鈕顯示的位置
5.ConfirmationMessage,按下按鈕時顯示一個確認對話框,並顯示這段文字,如刪除時,顯示”確定要刪除嗎?"
6.ID指顯示按鈕的名稱,全局唯一的。
7.ImageName,按鈕顯示什么圖標,這里不能選擇,可以去xafml中選擇那里是有預覽圖標可以看的。
8.PaintStyle,是指繪制的風格,可以選擇要不要顯示圖標,文字,或一起顯示。默認是都顯示。
9.QuickAcces,僅在winform中生效,是指在ribbon方式下顯示時,顯示在快速訪問的位置。
10.SelectionDependencyType,有三個選項,Independent:沒有限制,RequireSingleObject:選中一個對象時按鈕可用,RequireMultipleObject:選中多個對象時按鈕可用,含一個。
可以看到我們之前的按鈕沒有這項選擇依然可用。
而列表上的刪除按鈕,是RequireMultipleObject,即,可以同時刪除多條記錄。
11.Shortcut:快捷鍵,僅在win中生效。
12.TargetObjectCriteria,這里填寫的是一個條件,比如寫的是 "!已審核",則只在沒有被審核的記錄才能點擊這個按鈕,否則是不可以用的。
13.TargetObjectsCriteriaMode:指定是否所有當前選定的對象必須滿足targetobjectscriteria條件時才可以執行這個按鈕。

可先值:trueatleastforone
在選定的對象中至少有一個必須滿足的targetobjectscriteria條件才能執行按鈕。
trueforall
所有選定的對象必須都滿足的targetobjectscriteria條件才能執行按鈕。

這個就需要看業務要求來選擇使用了,通常都是trueforall的。

14.TargetObjectType:哪個類型可以顯示按鈕。如果有多種對象都需要顯示,我們演示的是客戶這個類,其實繼承自客戶類的視圖也會被生效,繼承還沒有演示過,后面會展示。

15.TargetViewID:僅指定的視圖才會生效。視圖ID在哪里?可以打開xafml找到指定的視圖,在ID屬性欄中就有。比如客戶詳細視圖就是 客戶_DetailView.

16.TargetViewNesting:目標視圖嵌套,有如下可選項:

  名稱 說明
Public field Any 任何視圖都會生效.
Public field Nested 必須是嵌套的視圖才生效,什么是嵌套的視圖?比如客戶詳細視圖中的聯系人列表,所屬大區列表.
Public field Root 非嵌套的視圖,就是root級別了,比如列表視圖,詳細視圖。

17.TargetViewType:視圖類型

  名稱 說明
Public field Any 任何視圖.
Public field DashboardView 組合視圖,這種還沒有出現過,后面介紹.
Public field DetailView 詳細視圖
Public field ListView 列表視圖

18.ToolTip:鼠標懸停時的提示信息。

 

按鈕的屬性就這么多,接下來再來看看控制器的屬性:

不選中任何按鈕,在控制器設計界面的空白區域點擊一下,查看屬性欄可以看到:

從TargetObjectType開始,才是有意義的。

這里的設置與按鈕是一樣的,需要注意的是,這里的Targetxxxxx是針對於整個控制器的,一個控制器中可以有多個按鈕,比如設置了TargetObjectType后,所有按鈕都在滿足這個條件后,才會顯示在界面上。

 

QQ 4603528 QQ群:336090194

 

 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM