MVVM 모델에서 모델은 INotifyPropertyChanged 인터페이스를 구현해야합니까?
나는에 대한 명확한 아이디어가 View
와 ViewModel
MVVM 패턴을. 내 응용 프로그램에서 MVVM 패턴을 구현할 계획입니다. 모델과 관련된 문제가 있습니다. 구문 분석 된 .xml 파일이 있고 정보가보기에 표시됩니다.
모델 변경 사항에 대한 알림을 처음으로 받아야합니다. 요청시 이후부터 알림을 받아야합니다.
그렇다면 모델을 구현하는 방법은 무엇입니까?
INotifyPropertyChanged
모델 클래스에서도 인터페이스를 구현해야합니까 ? ( INotifyPropertyChanged
WPF에 특화된 모델이므로 인터페이스를 구현해서는 안된다고 읽었습니다. )
INotifyPropertyChanged
모델에서 구현 하는 것은 전적으로 허용됩니다.
일반적으로 모델은보기에 쉽게 바인딩 할 수있는 기능을 구현합니다. 이는 일반적으로
INotifyPropertyChanged
및INotifyCollectionChanged
인터페이스를 통해 속성 및 컬렉션 변경 알림을 지원함을 의미합니다 . 개체 컬렉션을 나타내는 모델 클래스는 일반적으로 인터페이스ObservableCollection<T>
구현을 제공하는 클래스 에서 파생INotifyCollectionChanged
됩니다.
해당 유형의 구현을 원하는지 여부를 결정하는 것은 귀하에게 달려 있지만 기억하십시오-
모델 클래스가 필수 인터페이스를 구현하지 않으면 어떻게됩니까?
때때로 당신은 구현하지 않는 모델 객체와 함께 작동해야합니다
INotifyPropertyChanged
,INotifyCollectionChanged
,IDataErrorInfo
, 또는INotifyDataErrorInfo
인터페이스를. 이러한 경우 뷰 모델은 모델 개체를 래핑하고 필요한 속성을 뷰에 노출해야 할 수 있습니다. 이러한 속성의 값은 모델 개체에 의해 직접 제공됩니다. 뷰 모델은 노출하는 속성에 필요한 인터페이스를 구현하여 뷰가 쉽게 데이터를 바인딩 할 수 있도록합니다.
출처-http: //msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx
나는 우리가 INotifyPropertyChanged
모델에 구현하지 않은 일부 프로젝트에서 일 했고 이로 인해 많은 문제에 직면했습니다. VM에서 불필요한 속성 복제가 필요했고 동시에 BL / DL로 전달하기 전에 기본 개체 (업데이트 된 값으로)를 업데이트해야했습니다.
모델 개체 (예 : 편집 가능한 그리드 또는 목록) 또는 복잡한 모델의 컬렉션으로 작업해야하는 경우 특히 문제에 직면하게됩니다. 모델 개체는 자동으로 업데이트되지 않으며 VM에서 모든 것을 관리해야합니다.
표준 MVVM 접근 방식은 INotifyPropertyChanged
ViewModel에서만 구현하는 것입니다. 목적은 ViewModel에서 무언가 변경 될 때 View에서 적절한 바인딩을 새로 고치는 것입니다.
그러나 이것은 View에 의한 ViewModel 변경을 목표로합니다 . 즉,의 값을 변경 하면 ViewModel TextBox
의 INotifyPropertyChanged
구현이 관련 바인딩을 새로 고치므로 View가 올바르게 업데이트됩니다.
데이터베이스 변경 또는 다른 인터페이스와 같은 외부 소스에 의한 모델 변경 사항은 다루지 않습니다 . 모든 데이터 수정이 View에서 오는 한 ViewModel은 모든 변경 사항을 인식하고 업데이트 할 내용을 알고 있어야합니다. 예를 들어 Foo
모델의 변수 를 변경 Bar
하면 모델 의 값도 변경 된다는 것을 알고 있다면 의 값 을 변경할 때 OnPropertyChanged(Foo)
와 OnPropertyChanged(Bar)
ViewModel에서 모두 호출하는 것이 좋습니다 Foo
.
다른 대안은 Model과 ViewModel 사이의 이벤트를 사용하여 업데이트가 필요한 ViewModel의 값을 새로 고치는 것입니다. 말했듯이 알림이 "처음에만"필요한 경우 일부 트리거에서 새로 고침을 해제 한 후 수동으로 구현하는 것도 작동합니다.
이것은 MVVM으로 작업하는 동안 매우 일반적인 문제이며 INotifyPropertyChanged
WPF의 일부가 System.ComponentModel
아니므로 솔루션에 WPF 관련 참조를 추가 할 필요가 없습니다.
INofityPropertyChanged
Model에서 구현하면 ViewModel (Proxy Properties)에 더 많은 코드를 저장할 수 있습니다. 따라서 모델이 INotifyPropertyChanged
.
때때로 모델이 INotifyPropertyChanged
인터페이스를 구현하도록하는 것이 허용됩니다 .
예를 들어 모델에 시각화 할 속성이 많고 이러한 모델 속성을 노출하기 위해 뷰 모델에 많은 코드 (프록시 속성)를 구현하지 않으려는 경우입니다.
http://msdn.microsoft.com/en-us/magazine/ff798279.aspx를 보십시오 .
이것은 "순수한"MVVM 코더와 다른 사람들 사이의 고전적인 주장입니다.
나는 대부분의 경우 말이되기 때문에 가능한 한 책을 읽는 경향이 있습니다. 그러나 특정 시나리오에서 필요에 따라 코드를 즉석에서 수정하면 많은 중복 코드가 줄어 듭니다.
귀하의 경우 XML을 모델 클래스로 읽고 모델 클래스의 사본을 뷰 모델로 만들거나 원하는 속성을 모델에서 뷰 모델로 복사 할 수 있습니다. 이렇게하면 UI / 모델 업데이트를 제어 할 수 있습니다. 첫 번째 접근 방식을 따르는 경우 모델 클래스에 Inotifypropertychanged를 구현해야하며 허용됩니다.
뷰에 표시 / 조작되는 모든 속성을 정확하게 제어 할 수 있기 때문에 두 번째 접근 방식을 따르기 위해 최선을 다할 것이라고 말했습니다. 또한 MVVM 패턴을 깨지 않는 것이 훨씬 나아질 것입니다.
무슨 말인지 잘 모르겠습니다. VM에는 INotifyPropertyChanged
, 또는 DependencyProperty-es 가있을 수 있습니다 (이 경우 VM은에서 파생되어야 함 DependencyObject
). 둘 다 갖는 것은 의미가 없습니다. 또한 그들 중 아무것도 가지고 있지 않습니다.
모델에서는 원하는대로 할 수 있습니다. 이벤트를 발생 / 수신하는 기능은 좋지만 항상 신뢰할 수있는 것은 아닙니다. 기본적으로 모델은 소스 데이터 및 관련 항목에 의존하는 반면, 뷰 모델은 모델과 프레젠테이션 레이어를 인터페이스하는 부하가 있습니다. WPF는 이벤트에서 작동하므로 적어도 VM은 몇 가지 알림 메커니즘을 제공해야합니다.
'development' 카테고리의 다른 글
키별로 정렬 된 사전의 키 / 값 쌍 반복 (0) | 2020.12.30 |
---|---|
time ()은 좋은 소금입니까? (0) | 2020.12.30 |
동적 메모리 할당은 널리 사용되는 구현에서 C와 C ++에서 다릅니 까? (0) | 2020.12.30 |
데이터베이스 연결 문자열에 최대 풀 크기를 설정해야합니까? (0) | 2020.12.30 |
Node.js에서 process.nextTick의 적절한 사용 사례는 무엇입니까? (0) | 2020.12.30 |