2014-03-12 5 views
1

다음과 같이 제네릭 형식 T가있는 데이터 소스가 있습니다. 내가 UI의 변화를 보여줄 필요로일반 클래스 T에 대해 Inotifypropertychanged를 구현하는 방법?

public class GridObjectDataSource<T> 
{ 
} 

T는 우리가 일반 클래스 T.의 모든 속성 변경에 대한 위 클래스에서 구현할 수에서 INotifyPropertyChanged가 구현되지 않은 외부 클라이언트에서오고있다.

+0

가 확인하시기 바랍니다 참조 [이] (http://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist) 및 [이] (HTTP : // geekswithblogs.net/brians/archive/2010/07/27/inotifypropertychanged-with-less-code-using-generics-amp-reflection.aspx) 도움이 될 수도 있습니다 !!!! –

답변

1

단순히 구현해야 이벤트 정의로 예 당신은 당신의 제네릭 클래스에 그것을 구현할 수 있습니다

public class MyClass<T> : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

대리자를 들어 그 속성은 속성 이름과 이벤트를 발생시키는 개체에 대한 인스턴스 참조보다 더 특별한 것을 요구하지 않습니다. 거기에는 제네릭 마법이 필요하지 않습니다.

귀하의 소비 클래스는 단순히 그것으로 연결할 수 있습니다 :

var instanceOfMyClass = new MyClass<SomeObject>(); 
instanceOfMyClass.PropertyChanged += theHandlerForTheEvent; 

... 또는 ...

instanceOfMyClass.PropertyChanged += (o, e) => { do something; }; 

당신이 GridObjectDataSource<T>를 사용하는 경우 실제로 일을 할 것은 아주 좋은 패턴을하게 나타납니다 무엇 추상 기본 클래스 및 파생 클래스 (뷰 모델 등)는 T의 실제 유형을 지정합니다.

public abstract class GridObjectDataSource<T> : INotifyPropertyChanged 
{ 
    public abstract void DoSomething(T someInput); 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 


public class MySpecificViewModel : GridObjectDataSource<int> 
{ 

    public override void DoSomething(int someInput) 
    { 

    } 
} 
+0

단순히 인터페이스를 구현해도 예상되는 동작을 자동으로 추가하지는 않습니다. 기본'T' 객체를 직접 변경하면'GridObjectDataSource '은 그것을 알 수 없습니다. 그리고'PropertyChanged'는 절대로 제기되지 않습니다. – Dirk

+0

@Dirk 그렇습니다. 'T'자체가 속성이 변경된시기를 알고 싶다면'INotifyPropertyChanged'를 구현해야합니다. – slugster

+0

T가 이미 INotifyPropertyChanged를 구현 한 경우 위의 코드는 필요하지 않습니다. becoz는 개체 자체 만 업데이트합니다 .. – user3355293

0

당신이 할 수있는 최선의 제약 조건을 정의하는 것입니다

public class GridObjectDataSource<T> where T : INotifyPropertyChanged 
     { 
     } 
관련 문제