建立包含其他資料的自定義 EventArgs

自定義事件通常需要包含有關事件資訊的自定義事件引數。例如 MouseEventArgs 其用於通過像 MouseDownMouseUp 事件滑鼠事件,包含關於用於生成事件 LocationButtons 資訊。

建立新事件時,要建立自定義事件 arg:

  • 建立一個派生自 EventArgs 的類,並定義必要資料的屬性。
  • 作為慣例,類的名稱應以 EventArgs 結尾。

在下面的示例中,我們為類的 Price 屬性建立了 PriceChangingEventArgs 事件。事件資料類包含 CurrentPriceNewPrice。當你為 Price 屬性分配新值並讓消費者知道價值正在變化並讓他們知道當前價格和新價格時,該事件會引發:

PriceChangingEventArgs

public class PriceChangingEventArgs : EventArgs
{
    public PriceChangingEventArgs(int currentPrice, int newPrice)
    {
        this.CurrentPrice = currentPrice;
        this.NewPrice = newPrice;
    }

    public int CurrentPrice { get; private set; }
    public int NewPrice { get; private set; }
}

產品

public class Product
{
    public event EventHandler<PriceChangingEventArgs> PriceChanging;

    int price;
    public int Price
    {
        get { return price; }
        set
        {
            var e = new PriceChangingEventArgs(price, value);
            OnPriceChanging(e);
            price = value;
        }
    }

    protected void OnPriceChanging(PriceChangingEventArgs e)
    {
        var handler = PriceChanging;
        if (handler != null)
            handler(this, e);
    }
}

你可以通過允許使用者更改新值來增強該示例,然後將該值用於屬性。為此,只需在類中應用這些更改即可。

NewPrice 的定義更改為可設定:

public int NewPrice { get; set; }

在呼叫 OnPriceChanging 之後,將 Price 的定義更改為使用 e.NewPrice 作為屬性值:

int price;
public int Price
{
    get { return price; }
    set
    {
        var e = new PriceChangingEventArgs(price, value);
        OnPriceChanging(e);
        price = e.NewPrice;
    }
}