-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

根据您的编辑(似乎主要只是确认我的假设),我认为我建议您实施两个不同的活动是最好的。如果这对你不起作用,那么你可以更详细地解释为什么这个特定的解决方案对你来说似乎不合适或有用。 –