-2

考慮以下內置委託:C# - 委託專業化

public delegate void PropertyChangedEventHandler(object sender, 
     PropertyChangedEventArgs e); 

難道我謹向/過載/重寫委託給這個簽名:

public delegate void MyPropertyChangedEventHandler(object sender, 
     MyPropertyChangedEventArgs e); 

其中MyPropertyChangedEventArgs被聲明爲

public class MyPropertyChangedEventArgs : PropertyChangedEventArgs 
{ 
    public readonly object OldValue; 
    public readonly object NewValue; 

    public MyPropertyChangedEventArgs(string propertyName, object 
     oldValue, object newValue) : base(propertyName) 
    { 
     OldValue = oldValue; 
     NewValue = newValue; 
    } 
} 

並且擁有該事件的類被聲明爲

using System; 
using System.ComponentModel; 

// missing delegate decleration 

public class Bindable : INotifyPropertyChanged 
{ 
    public event MyPropertyChangedEventHandler PropertyChanged; 

    private object _property; 
    public object Property 
    { 
     get { return property; } 
     set 
     { 
      var oldValue = _property; 
      _property = value; 
      OnPropertyChanged("Property", oldValue, value); 
     } 
    } 

    protected void OnPropertyChanged(string name, object oldValue, 
      object newValue) 
    { 
     if (oldValue != newValue && PropertyChanged != null) 
      PropertyChanged(this, new MyPropertyChangedEventArgs(name, 
        oldValue, newValue)); 
    } 
} 

和事件訂閱應該允許訪問MyPropertyChangedEventArgs性能,而無需鍵入到處投的PropertyChangedEventArgs,仍然沒有失去外的現成的XAML綁定屬性。

例用例:

Bindable bindable = new Bindable(); 

bindable.PropertyChanged += (sender, args) => 
{ 
    if (args.OldValue != null) 
    { 
     // Do Something 
    } 
}; 
+0

這絕對是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。解釋爲什麼你首先需要一個'MyPropertyChangedEventArgs'。 –

+1

我需要額外的參數(OldValue/NewValue) – anragab

回答

0

假設MyPropertyChangedEventArgsPropertyChangedEventArgs派生(你是不是清楚這一點在你的問題),然後委託逆變肯定會允許客戶代碼訂閱您的「擴展」 PropertyChanged使用僅匹配基本PropertyChangedEventHandler的處理程序的事件。這是安全的,因爲這些處理程序承諾他們可以接受一個實例,並且代碼將通過的對象實際上是其中的一個(儘管派生更多)。

也就是說,如果有與綁定相關的代碼檢查特定的返回值,它可能會失敗,因爲它沒有找到它正在查找的事件。如果您確定這不是您的情況中的問題(這裏定義不明確,那麼complete, minimal code example真的可以幫助解決問題質量),那麼我想您不必擔心它本身。

但它仍然有點「iffy」的設計來做到這一點。恕我直言,定義第二個事件會更好(例如,命名爲MyPropertyChanged,或者在.NET/C#世界中更具慣用意義,PropertyChangedExEventArgs子類別的名稱相似)。然後,當財產變化時,提高這兩個事件。在任何現代計算機(包括移動平臺)上,這種最小的額外開銷將是微不足道的,而且它的好處是更簡潔,更易於使用的API。

+0

我剛剛編輯了這個問題,以澄清我不明確的意圖。這是建設性的? – anragab

+0

根據您的編輯(似乎主要只是確認我的假設),我認爲我建議您實施兩個不同的活動是最好的。如果這對你不起作用,那麼你可以更詳細地解釋爲什麼這個特定的解決方案對你來說似乎不合適或有用。 –