使用 CacheAttached 覆蓋圖中的 DAC 屬性
有時,你需要為特定螢幕覆蓋特定資料訪問類(DAC)欄位的一個或多個屬性,而不更改其他螢幕的現有行為。
替換所有屬性
假設原始 DAC 欄位屬性宣告如下:
public class ARInvoice : IBqlTable
{
[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Commission Amount")]
public virtual Decimal? CommnAmt
{
get;
set;
}
}
覆蓋圖中欄位屬性的基本方法是在圖中宣告 CacheAttached
事件處理程式,該處理程式遵循命名圖事件的標準約定(請注意缺少 EventArgs 引數)。事件處理程式的主體將不會被執行,但是你在處理程式上放置的任何屬性都將替換相應 DAC 欄位上的屬性:
[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Commission Amount")]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }
向 DAC 欄位新增新屬性
放置在 CacheAttached 處理程式上的屬性集將重新定義放置在 DAC 中的欄位上的整個屬性集。這幾乎總是矯枉過正; 請注意,在前面的示例中,為了只向欄位新增單個屬性,你必須從 DAC 複製所有其他屬性宣告。這導致不希望的程式碼重複,以及 DAC 和圖形不同步的可能性。很容易想象當某人改變 DAC 中的 PXDefaultAttribute
的預設邏輯時的情況,但忘記更新各種圖中 CacheAttached
處理程式上的所有相應屬性。
為了解決這個問題,Acumatica 框架提供了一個名為 PXMergeAttributesAttribute
的特殊屬性。將此屬性放在 CacheAttached
處理程式上時,你可以重用 DAC 中定義的現有屬性。
使用 PXMergeAttributesAttribute
追加屬性:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }
在上面的示例中,將重用原始 DAC 中的整個屬性集,並附加你在CacheAttached
事件處理程式上宣告的任何屬性。
PXMergeAttributesAttribute
具有其他合併行為,根據 Method 屬性的以下可能值:
MergeMethod.Replace
完全取代了 DAC 的屬性(相當於沒有PXMergeAttributesAttribute
)。MergeMethod.Append
將CacheAttached
處理程式的屬性附加到原始 DAC 屬性。MergeMethod.Merge
類似於Append
; 但是,它還會檢查處理程式屬性和 DAC 欄位屬性之間是否存在任何衝突屬性。如果存在衝突,則CacheAttached
屬性優先,並丟棄相應的 DAC 屬性。
覆蓋屬性的單個屬性
當你必須僅為特定螢幕重新定義 DAC 屬性的單個屬性時,會出現一種非常常見的應用程式開發方案; 在必須定義 PXUIFieldAttribute 的 DisplayName
屬性時考慮這種情況。
為此,你可以使用 Acumatica 框架提供的另一個特殊屬性:PXCustomizeBaseAttributeAttribute
。它的建構函式接受三個值:
- 需要覆蓋其屬性的 DAC 屬性的型別
- 要覆蓋的屬性的屬性名稱(在 C#6.0 中使用
nameof
運算子以實現程式碼可維護性) - 指定屬性的新值。
假設需要僅在一個螢幕上將 UI 顯示名稱從 Commission Amount 更改為 Base Currency Commission 。以下程式碼示例演示如何實現所需的行為。
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXCustomizeBaseAttribute(typeof(PXUIFieldAttribute), nameof(PXUIFieldAttribute.DisplayName), "Base Currency Commission")]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }
在此示例中,PXMergeAttributes
確保保留原始 DAC 屬性,PXCustomizeBaseAttribute
允許軟體工程師覆蓋相關圖形的 UI 欄位的顯示名稱。
用另一個屬性替換屬性
假設只需要一個螢幕就需要用 PXDBDefaultAttribute
替換 DAC 欄位的 PXDefaultAttribute
。
這可以通過以下方式實現:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXDefaultAttribute))]
[PXDBDefault(typeof(SOShipment.siteID), PersistingCheck = PXPersistingCheck.Nothing)]
protected void SOOrderShipment_SiteID_CacheAttached(PXCache sender) { }
屬性自定義屬性的應用順序
PXCustomizeBaseAttribute
PXRemoveBaseAttribute
PXMergeAttributes