-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

Предполагая MyPropertyChangedEventArgs происходит от PropertyChangedEventArgs (вы не ясно об этом в своем вопросе), то делегат контрвариантность, безусловно, позволит код клиента, чтобы подписаться на ваш «расширенный» PropertyChanged используя обработчики, которые соответствуют только базовым PropertyChangedEventHandler. Это безопасно, потому что эти обработчики обещают, что могут принять экземпляр PropertyChangedEventArgs, и объект, который будет передавать ваш код, на самом деле является одним из тех (хотя и более полученных).

Сказанное, если есть связанный с привязкой код, который проверяет конкретное возвращаемое значение, он может потерпеть неудачу просто потому, что он не нашел событие, которое он искал. Если вы уверены, что это не проблема в вашем сценарии (что плохо определено здесь & hellip; complete, minimal code example действительно помогло бы качеству вопроса здесь), то, я думаю, вам не нужно беспокоиться об этом как таковом.

Но для этого все-таки было бы «конструкцией« iffy ». ИМХО, было бы лучше определить второе событие (например, MyPropertyChanged или более идиоматическое в мире .NET/C#, PropertyChangedEx с аналогичным именем для подкласса EventArgs). Затем, когда свойство изменяется, поднимите оба события. На любом современном компьютере (включая мобильные платформы) эти минимальные дополнительные накладные расходы будут совершенно незначительными, а преимущество - гораздо более простой и понятный API.

+0

Я только что редактировал вопрос, чтобы прояснить мои намерения, которые вам не были понятны. Это было конструктивно? – anragab

+0

Основываясь на ваших изменениях (которые, по-видимому, в основном просто подтверждают мои предположения), я считаю, что мое предложение о том, что вы реализуете два разных события, является лучшим. Если это не сработает для вас, для вас было бы более полезно подробно объяснить, почему это конкретное решение кажется вам нецелесообразным или полезным для вас. –

Смежные вопросы