2011-08-03 5 views
48

MVVM 패턴에서 ViewViewModel에 대한 명확한 아이디어가 있습니다. 내 응용 프로그램에서 MVVM 패턴을 구현할 계획입니다. 모델과 관련된 문제에 직면하고 있습니다. 구문 분석되는 .xml 파일이 있고 정보가보기에 표시됩니다.MVVM 모델에서 모델이 INotifyPropertyChanged 인터페이스를 구현해야합니까?

처음으로 모델 변경 사항에 대한 알림을 받아야합니다. 수요가있을 때부터는 통보를 받아야합니다.

그래서 모델을 구현하는 방법은 무엇입니까?

도 모델 클래스에 INotifyPropertyChanged 인터페이스를 구현해야합니까? (나는 그 모델이 INotifyPropertyChanged 인터페이스를 구현해서는 안된다는 것을 알았습니다, WPF가 특정 적이기 때문에)

+3

복제본 [MVVM에서 ViewModel 또는 Model이 INotifyPropertyChanged를 구현해야합니까?] (http://stackoverflow.com/questions/772214/in-mvvm-should-the-viewmodel-or-model-implement-inotifypropertychanged) –

+0

위에 링크 된 다른 질문을 읽을만한 가치가 있습니다. –

답변

3

나는 무슨 뜻인지 잘 모르겠습니다. VM에는 INotifyPropertyChanged 또는 DependencyProperty-es가있을 수 있습니다 (이 경우 VM은 DependencyObject에서 파생되어야 함). 둘 다 갖는 것이 이치에 맞지 않게하십시오. 그들 중 누구도 갖지 않는 것도 말이되지 않습니다.

모델에서 원하는대로 할 수 있습니다. 이벤트를 시작/중지하는 기능은 훌륭하지만 언제나 그 기능을 신뢰할 수있는 것은 아닙니다. 기본적으로 모델은 원본 데이터 및 관련 재료에 따라 달라지며, 뷰 모델에는 모델과 프레젠테이션 레이어의 인터페이스가 있습니다. WPF는 이벤트에 대해 작동하므로 이상, 이상이어야합니다. 알림 메커니즘을 제공해야합니다.

12

표준 MVVM 접근 방식은 INotifyPropertyChanged을 ViewModel에만 구현하는 것입니다. 목적은 ViewModel에서 무엇인가가 변경 될 때 View에서 적절한 바인딩을 새로 고치는 것입니다.

그러나이 변경 사항은보기에서 ViewModel 의 변경 사항을 대상으로합니다. 즉, TextBox의 값을 변경하면 ViewModel의 INotifyPropertyChanged 구현이 관련 Bindings를 새로 고치므로보기가 올바르게 업데이트됩니다.

외부 변경 사항 (예 : 데이터베이스 변경 또는 다른 인터페이스)으로 인해 모델이 변경되었습니다. 모든 데이터 수정이 View에서 오는 한 ViewModel은 모든 변경 사항을 인식하고 업데이트 할 내용을 알고 있어야합니다. 예를 들어 모델에서 변수 Foo을 변경하면 Bar의 값이 Model에서 변경된다는 것을 알고있는 경우 Foo 값을 변경하면 ViewModel에서 OnPropertyChanged(Foo)OnPropertyChanged(Bar)을 모두 호출하는 것이 좋습니다.

다른 대안은 Model과 ViewModel 사이의 이벤트를 사용하여 ViewModel에서 업데이트가 필요한 값을 새로 고치는 것입니다. 만약 당신이 말했듯이, 통지가 "처음으로 만"필요하다면, 한 번 트리거를 한 번 새로 고침해서 매뉴얼을 구현하는 것도 효과가있다.

7

경우에 따라 모델에 INotifyPropertyChanged 인터페이스를 구현하도록 허용 할 수 있습니다.

예를 들어 모델에 시각화 할 속성이 많이 있고 그러한 모델 속성을 노출하기 위해 뷰 모델에 많은 코드 (프록시 속성)를 구현하지 않으려는 경우입니다.당신 솔루션의 모든 WPF 특정 참조를 추가 할 수 System.ComponentModel 그래서 아무 필요의 일부이기 때문에 http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

9

MVVM와 함께 작업하는 동안 이것은 매우 일반적인 문제에

이봐, INotifyPropertyChanged는 WPF 특정되지 않습니다.

모델에 INofityPropertyChanged을 구현하면 ViewModel (프록시 속성)에 더 많은 코드를 저장할 수 있습니다. 따라서 모델에는 INotifyPropertyChanged이 허용됩니다. 모델에서

40

구현 INotifyPropertyChanged 완전히 허용 -

는 일반적으로 모델이 쉽게보기에 바인드로 만드는 기능을 구현합니다. 이는 일반적으로 INotifyPropertyChangedINotifyCollectionChanged 인터페이스를 통해 등록 정보 및 콜렉션 변경 알림을 지원함을 의미합니다. 개체 컬렉션을 나타내는 모델 클래스는 일반적으로 ObservableCollection<T> 클래스에서 파생되며이 클래스는 INotifyCollectionChanged 인터페이스의 구현을 제공합니다.

당신에게 그것까지 당신이 구현의 유형을 원하거나 여부를 결정하지만, 기억하지만 -

어떤 모델 클래스는 필요한 인터페이스를 구현하지 않는 경우?

때때로 당신은 이 INotifyPropertyChanged, INotifyCollectionChanged, IDataErrorInfo, 또는 INotifyDataErrorInfo 인터페이스를 구현하지 않는 모델 객체와 함께 작동하도록해야합니다. 이 경우 보기 모델은 모델 개체를 래핑하고 뷰에 필요한 속성을 표시해야 할 수 있습니다. 이러한 속성의 값은 으로 모델 개체에서 직접 제공됩니다. 뷰 모델은 노출하는 속성에 대한 필수 인터페이스를 구현하므로 뷰는 쉽게 데이터에 바인딩 할 수 있습니다.

은에서 촬영 - 나는 우리가 우리의 모델 INotifyPropertyChanged을 구현 인해 우리는 많은 문제에 직면 이것하지 않은 일부 프로젝트에서 일했다 http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

; 불필요한 프로퍼티 중복이 VM에서 필요했고 동시에 BL/DL로 전달하기 전에 업데이트 된 값으로 기본 객체를 업데이트해야했습니다.

모델 개체 컬렉션 (편집 가능한 표 또는 목록) 또는 복잡한 모델로 작업해야하는 경우 특별히 문제가 있습니다. 모델 객체는 자동으로 업데이트되지 않으므로 VM의 모든 객체를 관리해야합니다.

+1

http://polymod.codeplex.com/을 살펴보십시오. 모델을 POCO로 가질 수 있고, Polymod 프록시로 포장하여 InotifyPropertyChanged 및 IDataErrorInfo를 제공 할 수 있습니다. Model/ViewModel에 많은 코딩을 저장합니다. – Arnaud

+0

감사합니다 Arnaud는 매우 유용한 프레임 워크처럼 보입니다. – akjoshi

+0

DTO를 사용하는 경우 수행 할 작업 INotifyPropertyChanged를 사용하여 DTO를 처리하겠습니까? Compact Framework와 함께 구현 한 일부 모델을 공유하려고 시도했는데 – GorillaApe

2

"순수한"MVVM 코더와 다른 MVVM 코더 사이의 고전적인 논증입니다.

나는 대부분의 시간이 이해되기 때문에 가능한 한 언제든지 책을 읽는 경향이 있습니다. 그러나 필요에 따라 코드를 즉흥적으로 실행하는 특정 시나리오에서는 많은 중복 코드가 줄어 듭니다.

XML을 모델 클래스로 읽고 모델 클래스의 복사본을 뷰 모델로 만들거나 모델에서 원하는 속성을 뷰 모델로 복사 할 수 있습니다. 이렇게하면 UI/모델을 업데이트 할 수 있습니다. 첫 번째 접근법을 따르는 경우 Inotifypropertychanged를 모델 클래스에 구현해야하며 허용 될 수 있습니다.

필자는 두 번째 방법을 따르기 위해 최선의 노력을 다하겠다고 말했기 때문에 뷰에 표시되거나 조작되는 모든 속성을 정확하게 제어 할 수 있기 때문에 최선을 다할 것입니다. 또한 MVVM 패턴을 깨뜨리지 않고 훨씬 나아질 것입니다.

관련 문제