2013-03-26 2 views
1

몇 가지 클래스를 작성 중이며 INotifyPropertyChanged을 구현하여 해당 클래스를 모두 "데이터 바인딩 준수"(WPF 또는 아마도 더 희귀 한 WinForms)로 만들고 싶습니다.동일한 이벤트 호출자 다시 구현

문제는 반복되는 코드입니다. 나는 실제로 똑같은 방법을 반복해서 복사하여 붙여 넣는다 (나는 농담하지 않는다).

protected void OnPropertyChanged([CallerMemberName] String propertyName = null) 
{ 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

나는 잠시 동안이 문제를했지만, 오늘 구체적으로는 또 다시 일어나고 유지, 그래서 나는 당신이 솔루션 나를 도울 수 있기를 바랍니다. 이 방법을 사용하는 클래스가 거의 12 개이고 코드 조각을 반복하는 것을 정말 싫어합니다.

구현할 기본 클래스를 만들려고했는데 (아마 NotifyPropertyChangedObject이라는 이름을 쓰겠습니다) 실제로는 다중 상속없이 클래스를 제한한다는 잘못된 생각 일 수 있습니다.
또한 확장 메서드를 생각했지만 protected 메서드로 범위를 지정하고 싶습니다. 따라서이 메서드도 작동하지 않습니다.

이 문제를 해결하기 위해 수행 할 수있는 작업은 무엇입니까?

답변

3

기본 클래스를 갖는 것은 MVVM Helper 라이브러리가 수행하는 방법입니다. 그것에는 단점이 없습니다.

예 C# 클래스에는 하나의 기본 클래스 만 가질 수 있지만 여러 인터페이스를 구현해야합니다. 귀하의 경우를 들어 당신이 할 수있는 모든 그냥 ViewModelBase에서 상속을, 기본 클래스는 INPC를 구현하고 지금 현재 당신이 클래스 A에서 클래스 X 상속이 경우 ViewModelBase

전화가 있다고 가정합니다.

당신은 따라서, 따라서 현재의 기본 클래스는이 새로운 INPC 제공 클래스에서 상속하고 당신은 당신의 파생 클래스

업데이트의에에서

을 INPC 구현을위한 코드 중복이없는 당신의 어떤 이유에서든 이미 다른 기본 클래스를 가지고 있고 INPC의 공개 구현과 같은 것을 말하지 않는 제한을 가진 특별한 경우는이 객체에 멤버 변수로 전달됩니다.

이 :

Fody 특히 그것이이 INPC 구현 자체가, 이렇게 붙여 넣기 코드를 복사 할 필요가없는 주입하고 그것은 또한 당신이 사용자 정의베이스에서 도출 할 수 있기 때문에 부가 PropertyChanged - Addon이 희망이 당신을 도울 것입니다

입니다 클래스 (여전히 INPC를 지정해야하지만 여기서는 인터페이스 일뿐입니다)

+0

.NET 클래스는 어떻습니까? 나는 그 (것)들을 필요로하고, 나는 그 (것)들을 나의 기본적인 종류를 상속하게 할 수 없다. – MasterMastic

+0

어떤 .Net 클래스에 대해 이야기하고 있습니까? 뷰 (Window, UserControl, Button)와 관련이 있다면 필요할 때 종속성 프로퍼티를 하위 클래스로 추가합니다. 나는 심지어 그들에 INPC를 구현하지 않는다. – Viv

+0

나는 그 반대의 정확한 이야기이다. 뷰 클래스 또는 데이터 바인딩과 관련이없는 클래스. (간단히 말해서, 변경 될 때 통지하지 않는 클래스). 이 클래스에서 상속받을 수 있고 내 질문에서이 메서드를 반복하지 않고 내 (확장 된) 필드가 변경된 경우에도 어떻게 알릴 수 있습니까? 그게 내 질문에 관한 전부입니다. 그래서 나는 아직 당신의 대답을 받아들이지 않았습니다. 그럼에도 불구하고 환상적입니다. BTW 할 수없는 경우, 그 대답도 될 것입니다. – MasterMastic

0

대개 내보기를보기 모델 유형 객체, 즉보기에 필요한 모든 데이터가 들어있는 객체에 바인딩합니다. 이는보기가 하나의 객체에만 바인드되어야하므로 더 쉽게 작업 할 수있는 시스템을 만듭니다.

보통 비즈니스 개체가 뷰 모델에 데이터를 노출하고 뷰 모델이 상태가 변경되었다는 사실을 뷰 모델에 알리도록 단일 이벤트를 노출합니다.이 시점에서 뷰 모델은 관련 속성 별 알림을 뷰에 호출합니다. . 즉 위의 메소드는보기 /보기 모델 당 한 번만 구현하면됩니다.

MVVM 모델을 아직 확인하지 않은 경우 살펴보십시오. 위의 내용은 무수한 접근법 중 하나 일뿐입니다. 실제로 일부 해석에 동의하거나 특정 시나리오에 맞지 않을 수 있습니다.

+0

내 요점을 설명하려면 : VM에서 다음과 같은 속성을 사용하십시오. 'string _labelName; 공용 문자열 LabelName {get {return _labelName; } 세트 {if (value == _labelName) return; _labelName = 값; notifyPropertyChanged(); }}' –

0

@viv에 대한 답변을 추가하려면, Fody + PropertyChanged을 이미 사용하기로 결정했다면 기본 클래스를 사용하지 않는 것이 좋습니다. PropertyChanged는 모든 INPC 구현을 수행하므로 기본 클래스를 갖는 데는 거의 가치가 없습니다. 실제로 가치보다 고통이 더 큽니다. 수업에 PropertyChanged.ImplementPropertyChanged 속성을 추가하기 만하면 나머지 작업이 자동으로 수행됩니다.

당신이 소유하지 않으며 따라서 INPC를 구현할 수있는 클래스에 관한. 가장 좋은 방법은 바인딩하려는 각 클래스의 단순화 된 버전을 나타내는 복제 클래스를 만드는 것입니다. 보기를로드하고 끝낼 때 값을 읽고 쓸 수 있습니다. 또는 특정 속성에만 바인딩하려는 경우 이러한 속성을 기본보기 모델에 배치하십시오.