-2

다음 내장 위임 고려 :C 번호 - 위임 전문

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

MyPropertyChangedEventArgs는 다음과 같이 선언 :이 서명에 대리자를 오버라이드 (override)// 과부하 확장하는 것을

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

그것을 가능을

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)); 
    } 
} 

및 이벤트 가입은 어디에서나 PropertyChangedEventArgs 캐스팅 여전히 아웃 - 오브 - 박스 XAML은 속성에 바인딩을 잃지 입력 할 필요없이 MyPropertyChangedEventArgs 속성에 대한 액세스를 허용해야합니다.

예 유스 케이스 : 다음 contravariance 확실히 클라이언트 코드가 "확장"을 PropertyChanged를 구독 할 수 있도록 위임

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에서 파생 가정 (당신은 당신의 질문에 이것에 대해 명확하지 않다) 이벤트는 기본 PropertyChangedEventHandler 만 일치하는 핸들러를 사용합니다. 이러한 처리기는 PropertyChangedEventArgs 인스턴스를 수락 할 수 있다고 약속하고 코드에서 전달할 개체는 실제로는 파생되지만 (더 파생 됨) 안전합니다.

즉, 특정 반환 값을 확인하는 바인딩 관련 코드가 있으면 찾고 있던 이벤트를 찾지 못했기 때문에 실패 할 수 있습니다. 시나리오에 문제가 없다고 확신 할 수 있다면 (여기서 & hellip; complete, minimal code example이 질문의 품질을 높이는데 도움이 될 것입니다.) 그 자체로 걱정할 필요는 없습니다.

하지만이 작업을 수행하는 데 여전히 "불확실한"디자인이 사용됩니다. 이모, MyPropertyChanged 또는 하위 클래스의 비슷한 이름을 가진 PropertyChangedEx 등 더 많은 관용적 인 두 번째 이벤트를 정의하는 것이 좋습니다. 그런 다음 속성이 변경되면 두 이벤트를 모두 발생시킵니다. 모든 최신 컴퓨터 (모바일 플랫폼 포함)에서이 최소한의 추가 오버 헤드는 전혀 중요하지 않으며 이점은 훨씬 깔끔하고 사용하기 쉬운 API입니다.

+0

방금 ​​질문을 편집하여 사용자에게 명확하지 않은 의도를 명확히했습니다. 그것은 건설적 이었습니까? – anragab

+0

편집 내용 (주로 내 가정을 확인하는 것처럼 보임)을 기반으로 두 가지 다른 이벤트를 구현하는 것이 가장 좋습니다. 그것이 당신을 위해 작동하지 않는다면 왜 그 특정한 해결책이 왜 당신에게 적절하지 않거나 유용하지 않은지를 상세하게 설명하는 것이 더 생산적 일 것입니다. –