5

Entity Framework 모델과 함께 MVVM 패턴을 사용하여 C#으로 데스크톱 응용 프로그램을 작성하고 있습니다. VM의 DependencyProperties를 사용하는 경향이 있으며 (일반적으로)이 시스템을 INotifyPropertyChanged를 구현하는 것보다 선호합니다. 나는 일들을 일관성있게 유지하고 싶다. 내 VM은 모델의 엔티티에 액세스하고 뷰포트에는 바인딩 및 명령 이름을 제외한 VM에 대한 지식이 없으며 모델은 VM의 지식을 알고 있습니다. 는 VM의에서 INotifyPropertyChanged를 사용Entity Framework에서 ViewModel에 DependencyProperty 사용

, 모델의 엔티티를 업데이트하는 아주 쉽게 보인다 CurrentPerson는 Person 객체 엔터티 데이터 모델에 의해 자동 생성 된 것입니다

public string Forename 
    { 
     get { return CurrentPerson.Forename; } 
     set 
     { 
      if (Forename != value) 
      { 
       CurrentPerson.Forename = value; 
       NotifyPropertyChanged("Forename"); 
      } 
     } 
    } 

.... 따라서 Forename을 저장하기 위해 특별히 만든 개인 필드가 없습니다.

DependencyProperties를 사용하면 DP를 만들고 GetValue 및 Setvalue를 사용하여 기본 속성을 추가 한 다음 PropertyPangedCallback을 사용하여 CurrentPerson 엔터티를 업데이트해야합니다. 이 상황에서 콜백을 호출하면 다른 VM과 일관성을 유지하기 위해 오버 헤드가 추가되는 것으로 보입니다.

따라서이 두 가지 방법 중 하나가 다른 방법인지 여부는 이어야합니다.해야합니까? 이 인스턴스에서는 DependencyProperty 또는 INotifyPropertyChanged를 사용해야합니까? 한 가지 지적해야 할 점은 잠재적으로 매우 큰 규모의 프로젝트 (플러그인과 여러 컴퓨터에서 많은 데이터베이스 액세스가 가능함)이며 모든 것이 재사용 가능해야하며 모듈은 가능한 한 "연결이 끊어져"있어야한다는 것입니다. .

+0

뷰 모델에서 종속성 속성을 사용하는 이점은 무엇입니까? 다시 말해 INotifyPropertyChanged가 제공하는 추가적인 가치는 무엇입니까? –

+0

나는 좋은 속도와 DP와 함께 제공되는 멋진 바인딩 기능을 찾고 있습니다. 내 뷰에서 XAML을 사용하여 DP에 직접 바인딩한다는 점을 명심하십시오. 또한 부동산 가격이 자주 바뀔 수 있습니다. 바인딩과 함께 속도를 위해 이전에 찾은 참조에서 DP가 갈 수있는 방법입니다. 나머지 디자인과도 일관성이 있습니다. 그러나 Entity 객체에 대한 별도의 수정을 통해 진행되는 모든 콜백에 의해 무효화되는 경우 아무런 이점이 없습니다. –

답변

2

DependencyProperty 대신 INotifyPropertyChanged를 사용하는 것이 좋습니다. DependencyProperty가 WindowsBase.dll에 있기 때문에 ViewModels에서 DependencyProperty를 사용하지 않는 주된 이유가 있습니다. 이렇게하면 Windows UI가 너무 많이 (적어도 IMHO) 연결됩니다.

INotifyPropertyChanged를 사용하면 다양한 플러그인이 원하는대로 구현할 수 있으므로 유지 관리가 훨씬 쉽습니다. 종속성 속성을 강제로 설정하면 모든 뷰 모델이 DependencyObject에서 상속해야합니다.

에서 INotifyPropertyChanged와 DependencyProperty에의 사용에 대한 자세한 내용은이 문서를 참조하십시오 http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

또 다른 지원 대답 : https://stackoverflow.com/a/783154/27669

+0

감사합니다. INotifyPropertyChanged는 "Magic Strings"를 사용하는 다양한 보호 장치가있는 이벤트이지만 INotifyPropertyChanged는 앞으로 나아갈 길입니다. 이 두 가지 주된 이유는 다음과 같습니다. 1) DP와의 상태 복제 및 2) 전체 개체 상태를 변경해야하는 경우가 있으며 PropertyChanged (null)로이 작업을 간단하게 수행 할 수 있습니다. 답변과 참고를 보내 주셔서 감사합니다. –

+0

Windows UI에 대한 연결은 주요한 문제 일 수 있습니다. 웹 서비스에 동일한 dll이 사용되었지만 종속성 속성이 다중 스레드 웹 서비스에서 다소 까다로운 UI 스레드에서 실행되는 것으로 주장 된 프로젝트를 수정했습니다.이 아키텍처의 유연성 (즉, Entity Dll의 Windows GUI와의 긴밀한 연결 부족)은 GUI의 우아함보다 훨씬 중요합니다. – user1496062

관련 문제