programing

MVVM에서 View Model 또는 Model은 INotify를 구현해야 합니다.속성이 변경되었습니까?

instargram 2023. 4. 12. 21:44
반응형

MVVM에서 View Model 또는 Model은 INotify를 구현해야 합니다.속성이 변경되었습니까?

지금까지 살펴본 대부분의 MVVM 예에서는 모델이 구현되어 있습니다.INotifyPropertyChanged 단, Josh Smith의 Command Sink 에서는 View Model이 구현합니다.

아직 MVVM 개념을 인지적으로 정리하고 있기 때문에 다음 사항을 알 수 없습니다.

  • 넣어야 요.INotifyPropertyChanged에서 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★CommandSink을 하다
  • 이건 그냥 일반적인 일탈일 뿐이지 별로 중요하지 않아
  • 모델 합니다.INotifyPropertyChanged 수 입니다.

작업한 MVVM 프로젝트에서 다른 사람의 경험은 어땠습니까?

는 이 이 이 모델을 는 안 한다.INotifyPropertyChanged이 인터페이스는 UI에 고유하지 않습니다.그것은 단순히 변화를 알려준다.실제로 WPF는 변경을 식별하기 위해 이 기능을 많이 사용하지만 UI 인터페이스라는 의미는 아닙니다.타이어는 자동차 부속품이라고 하는 코멘트와 비교하겠습니다.네, 하지만 자전거나 버스 등도 이용합니다.요약하면 이 인터페이스를 UI로 받아들이지 마십시오.

그렇다고 해서 반드시 모델이 알림을 제공해야 한다고 생각하는 것은 아닙니다.실제로 이 인터페이스는 필요한 경우를 제외하고 모델에서는 구현하지 않는 것이 원칙입니다.서버 데이터가 클라이언트 앱에 푸시되지 않은 대부분의 경우 모델이 오래되었을 수 있습니다.그러나 금융 시장 데이터를 듣는다면, 왜 모델이 인터페이스를 구현할 수 없는지 알 수 없습니다.예를 들어, 특정 값에 대한 입찰 또는 문의 가격을 받으면 알림(이메일 등)을 발행하거나 주문을 발행하는 서비스 등 UI 이외의 논리가 있는 경우에는 어떻게 해야 합니까?이것은 깨끗한 해결책이 될 수 있습니다.

하지만, 일을 성취하는 방법은 다양하지만, 나는 항상 단순함을 지지하고 중복을 피한다.

뭐가 더 나아요?뷰 모델에서 컬렉션 또는 속성 변경에 대한 이벤트를 정의하고 이를 모델로 전파하거나 뷰가 (뷰 모델을 통해) 모델을 자동으로 업데이트하도록 할 수 있습니까?

결론은, 「이것도 저것도 할 수 없다」라고 주장하는 사람을 볼 때마다, 그것은 그들이 무슨 말을 하고 있는지 모르는 징조이다.

실제로 고객의 상황에 따라 다르며, 사실 MVVM은 많은 문제가 있는 프레임워크이며 MVVM의 일반적인 구현은 아직 보이지 않습니다.

MVVM의 다양한 플레이버와 일반적인 문제에 대한 해결책에 대해 설명할 시간이 좀 더 있었으면 좋겠습니다.주로 다른 개발자가 제공하지만, 다음 기회에 설명해야 할 것 같습니다.

라고 말할, 내을 넣는다. 저는 항상 제 옷을INotifyPropertyChangedMy View Model - 다음과 같은 WPF 고유의 기능으로 모델을 오염시키고 싶지 않을 것입니다.INotifyPropertyChanged뷰모델에 저장해야 합니다.

다른 사람들은 동의하지 않겠지만, 그게 내가 일하는 방식이야.

always항상은 )가 M-V-VM View Model을 합니다.INotifyPropertyChanged

http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx에서 M-V-VM 프로젝트 템플릿/툴킷을 확인하십시오.를 사용합니다.DelegateCommandM-V-VM은 M-V-VM을 사용합니다.

MVVM의 이름은 매우 좋지 않습니다. ViewModel을 ViewModel이라고 부르면 많은 사람들이 잘 설계된 아키텍처의 중요한 기능인 DataController를 놓치게 됩니다.

View-Model을 DataController 이상으로 생각하고 DataController가 데이터에 영향을 미치는 유일한 항목인 아키텍처를 구현하는 경우 데이터를 직접 만지지 않고 항상 DataController를 사용할 수 있습니다.DataController는 UI에 유용하지만 UI에만 유용한 것은 아닙니다.비즈니스 계층, UI 계층 등을 위한 것입니다.

DataModel -------- DataController ------ View
                  /
Business --------/

결국엔 이런 모델이 생기게 됩니다.기업도 View Model을 사용하여 데이터를 만져야 합니다.그러면 당신의 수수께끼는 그냥 사라집니다.

모델을 어떻게 구현했느냐에 따라 달라집니다.하여 Lotka CSLA를 폭넓게 .INotifyPropertyChanged츠요시

검증 엔진은 이 메커니즘을 통해 속성이 변경된다는 것을 통지받는 데 크게 의존하고 있으며 매우 잘 작동합니다.변경 통지가 운영에 그다지 중요하지 않은 비즈니스 객체 이외의 다른 구현을 사용하는 경우에는 비즈니스 모델의 변경을 감지하는 다른 방법을 사용할 수 있습니다.

또한 필요한 경우 모델에서 변경 사항을 전파하는 View Model도 있지만 View Model은 기본 모델 변경 사항을 수신합니다.

는 파울로의한다.INotifyPropertyChanged 수 있으며 - suggested suggested suggested 。

일반적으로 모델은 뷰에 쉽게 바인딩할 수 있는 설비를 구현합니다. 및 변경 합니다.INotifyPropertyChanged ★★★★★★★★★★★★★★★★★」INotifyCollectionChanged인터페이스입니다.에서 됩니다.ObservableCollection<T>합니다.클래스 : 이클 class 、 class class class class class 。INotifyCollectionChanged인터페이스입니다.

이러한 타입의 실장을 원하는지 아닌지는, 고객에게 달려 있습니다만,

모델 클래스에서 필요한 인터페이스가 구현되지 않으면 어떻게 해야 합니까?

, 에서는, 「모형 오브젝트」를 것이 하게 되는 경우가 있습니다.INotifyPropertyChanged,INotifyCollectionChanged,IDataErrorInfo , 「」INotifyDataErrorInfo인터페이스입니다.이 경우 뷰 모델은 모델 객체를 줄바꿈하고 필요한 특성을 뷰에 표시해야 할 수 있습니다.이러한 속성의 값은 모델 객체에 의해 직접 제공됩니다.뷰 모델은 뷰가 해당 속성에 쉽게 데이터를 바인딩할 수 있도록 해당 속성에 필요한 인터페이스를 구현합니다.

취득처 - http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

는 아직하지 않은 .INotifyPropertyChanged에 직면했습니다. 복제가 했고, 에 BL 오브젝트된 값.VM에 불필요한 속성 복제가 필요했고 BL/DL에 전달하기 전에 기본 객체(업데이트된 값)를 업데이트해야 했습니다.

모델 오브젝트 컬렉션(편집 가능한 그리드 또는 목록 내) 또는 복잡한 모델을 조작해야 하는 경우 특히 문제가 발생합니다.모델 오브젝트는 자동으로 갱신되지 않고 VM 내의 모든 것을 관리해야 합니다.

모든 것은 사용 사례에 따라 다르다고 생각합니다.

속성 로드가 있는 단순 모델이 있는 경우 INPC를 구현하도록 할 수 있습니다.단순하다는 것은 이 모델이 다소 POCO처럼 보인다는 것을 의미합니다.

모델이 더 복잡하고 인터랙티브 모델 도메인(모델 참조 모델, 다른 모델의 이벤트 구독)에 살고 있는 경우 모델 이벤트를 INPC로 구현하는 것은 악몽입니다.

다른 모델과 연계해야 하는 모델 엔티티의 입장에 자신을 둡니다.구독할 다양한 이벤트가 있습니다.모두 INPC로 구현됩니다.가지고 있는 이벤트 핸들러를 상상해 보세요.if-clauss 및/또는 스위치 Clauss의 거대한 캐스케이드.

INPC의 다른 문제앱은 구현이 아닌 추상화에 의존하도록 설계해야 합니다.이것은, 통상은 인터페이스를 사용해 행해집니다.

다음 두 가지 동일한 추상화 구현에 대해 살펴보겠습니다.

public class ConnectionStateChangedEventArgs : EventArgs
{
    public bool IsConnected {get;set;}
}

interface IConnectionManagerINPC : INotifyPropertyChanged
{
    string Name {get;}
    int ConnectionsLimit {get;}
    /*

    A few more properties

    */
    bool IsConnected {get;}
}

interface IConnectionManager
{
    string Name {get;}
    int ConnectionsLimit {get;}
    /*

    A few more properties

    */
    event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
    bool IsConnected {get;}
}

이제 둘 다 보세요.IConnection Manager란INPC가 말해?일부 특성이 변경될 수 있습니다.당신은 그들 중 어느 쪽인지 모른다.실제로는 IsConnected만 변경되며 나머지는 읽기 전용입니다.

반대로 Iconnection Manager의 의도는 명확합니다. "IsConnected 속성의 값이 변경될 수 있습니다."

ViewModel에 있는 것 같습니다.모델은 UI에 의존하지 않기 때문에 모델의 일부가 아닙니다.모델은 '비즈니스에 구애받지 않는 모든 것'이어야 합니다.

그러나 (이 프레젠테이션 링크 텍스트에서와 같이) 일부 데이터를 애플리케이션에 온라인으로 제공하고 새로운 데이터가 도착했거나 이벤트를 사용하여 데이터가 변경되었음을 통지해야 하는 서비스인 경우가 있습니다.

만약 당신이 MV-VM을 고수하고 싶다면 답은 매우 분명하다고 생각합니다.

참조: http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx

MVVM 패턴에서는 뷰는 UI와 임의의 UI 로직을 캡슐화하고 뷰 모델은 프레젠테이션 로직과 상태를 캡슐화하고 모델은 비즈니스 로직과 데이터를 캡슐화합니다.

뷰는 데이터 바인딩, 명령 및 변경 알림 이벤트를 통해 뷰 모델과 상호 작용합니다.뷰 모델은 뷰에 표시하기 위해 필요에 따라 데이터를 변환, 검증 및 집계하고 모델에 대한 업데이트를 쿼리, 관찰 및 조정합니다."

모델이 ViewModel에서 쉽게 노출되는 경우 모델에 INPC를 구현할 수 있습니다.그러나 일반적으로 View Model 랩은 모델의 복잡성을 줄이기 위해 자신의 클래스입니다(바인딩에 유용해서는 안 됩니다).이 경우 INPC를 ViewModel에 구현해야 합니다.

는 ★★★★★★★★★★★★★★를 사용하고 있습니다.INotifyPropertyChange인터페이스로 설정합니다.실제로 모델 속성 변경은 UI 또는 외부 클라이언트에서만 실행해야 합니다.

몇 가지 장점과 단점을 발견했습니다.

이점

비즈니스 모델에 알림이 있습니다.

  1. 도메인이 주도하고 있는 것처럼, 그것은 옳습니다.언제 올릴지 언제 안 올릴지를 결정해야 한다.

단점들

모델에 속성(수량, 환율, 수수료, 총계)이 있습니다.총액은 QTY, 환율, 수수료 변경을 사용하여 계산됩니다.

  1. db에서 값을 로드할 때 총 우선도 계산은 3회(qty, rate, commission) 호출됩니다.한 번이어야 한다.

  2. rate, qty가 비즈니스 계층에 할당되어 있는 경우 다시 알림이 호출됩니다.

  3. 이것을 디세블로 하는 옵션이 있습니다(기본 클래스일 수도 있습니다).그러나 개발자들은 이것을 하는 것을 잊어버릴 수 있다.

를 사용합니다.INotifyPropertyChange

'이렇게'를 합니다.IDataErrorInfo검증 오류를 처리할 수 있도록 ViewModel만 유지하면 MVVM을 바로 이용할 수 있습니다.

뷰에 있는 객체의 참조가 변경된다고 가정합니다.올바른 값을 표시하기 위해 업데이트할 모든 속성을 어떻게 통지합니까? " "OnPropertyChanged당신이 보기에 모든 물체의 특성은 제 관점에서는 쓰레기입니다.

때 수 하는 가 보기에 저는 같은 을 사용하고 있습니다.또한 제가 보기에는 다음과 같은 바인딩을 사용하고 있습니다.Object.Property1,Object.Property2 지금 는 그냥 그렇게 하면 .OnPropertyChanged("Object").

오브젝트 개의 하지 않도록 "true"에서됩니다.OnPropertyChanged아무것도 안 해요.

View Model을 합니다.INotifyPropertyChanged것( 파일, 또는 이 될 수 모델은 모든 것(xml 파일, 데이터베이스 또는 객체)이 될 수 있습니다.모델은 뷰모델에 데이터를 제공하는 데 사용되며 뷰모델은 뷰로 전파됩니다.

여기를 참조해 주세요.

는 뷰 이 imho를 구현한다고 합니다.INotifyPropertyChange또한 모델은 다른 "수준"에서 알림을 사용할 수 있습니다.

예를 들어 일부 문서 서비스 및 문서 오브젝트의 경우 뷰 모델이 보기를 지우고 재구성하기 위해 수신하는 변경된 이벤트가 있습니다.편집 뷰 모델에서는 보기를 지원하기 위해 문서 등록 정보를 변경할 수 있습니다.저장 시 문서(변경 날짜, 최종 사용자 업데이트 등)를 많이 수행하면 Ipropertychanged 이벤트가 오버로드되기 쉽고 문서 변경만으로도 충분합니다.

,을 INotifyPropertyChange당신의 모델에서는 뷰에서 직접 가입하는 대신 뷰모델로 중계하는 것이 좋은 방법이라고 생각합니다.이 경우 모델에서 이벤트가 변경될 때 뷰 모델만 변경하면 뷰는 변경되지 않고 그대로 유지됩니다.

뷰에 바인딩된 모든 속성은 뷰 모델에 있습니다.따라서 Inotify를 구현해야 합니다.Property Changed 인터페이스따라서 보기는 모든 변경 사항을 가져옵니다.

[MVVM Light Toolkit을 사용하여 View Model Base에서 상속받았습니다.

모델은 비즈니스 논리를 유지하지만 보기와는 아무런 관련이 없습니다.따라서 Inotify는 필요 없습니다.Property Changed 인터페이스

언급URL : https://stackoverflow.com/questions/772214/in-mvvm-should-the-viewmodel-or-model-implement-inotifypropertychanged

반응형