使用 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.AppendCacheAttached 處理程式的屬性附加到原始 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) { }

屬性自定義屬性的應用順序

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes