[wpf] ViewModel의 INotifyPropertyChanged 대 DependencyProperty


Answers

WPF 성능 가이드에 따르면 DependencyObjects는 확실히 INotifyPropertyChanged를 구현하는 POCO보다 성능이 뛰어납니다.

http://msdn.microsoft.com/en-us/library/bb613546.aspx

Question

Model-View-ViewModel 아키텍처 WPF 응용 프로그램에서 ViewModel을 구현할 때 데이터 바인딩 가능하게 만드는 두 가지 주요 옵션이있는 것 같습니다. 뷰에 바인딩 할 속성에 대해 DependencyProperty 를 사용하는 구현을 보았고 대신 ViewModel에서 INotifyPropertyChanged 를 구현 한 것을 보았습니다.

제 질문은 언제 다른 쪽을 선호해야합니까? 성능 차이가 있습니까? WPF에 ViewModel 의존성을 부여하는 것이 좋은 생각입니까? 디자인 결정을 내릴 때 고려해야 할 다른 사항은 무엇입니까?




나는 INotifyPropertyChanged를 사용하지 않고 Presentation Model 에서 블로그에 직접 접근하는 방식을 선호합니다. 데이터 바인딩의 대안을 사용하면 부기 코드없이 CLR 속성에 직접 바인딩 할 수 있습니다. View Model에 평범한 .NET 코드를 작성하면 데이터 모델이 변경 될 때 업데이트됩니다.




다른 컨트롤에 속성을 표시하려면 종속 속성을 사용해야합니다 ... 그러나 행운을 내기 위해 시간이 좀 걸리기 때문에 ...




WPF에 ViewModel 의존성을 부여하는 것이 좋은 생각입니까?

.NET 4.0에는 System.Xaml.dll이 있으므로 임의의 프레임 워크를 사용하기 위해 종속성을 사용할 필요가 없습니다. PDC 세션에 대한 Rob Relyea의 게시물을 참조하십시오.

내 걸릴

XAML은 개체를 설명하는 언어이고 WPF는 설명 된 개체가 UI 요소 인 프레임 워크입니다.

이들의 관계는 논리를 기술하는 언어 인 C #과 특정 종류의 논리를 구현하는 프레임 워크 인 .NET과 유사합니다.

XAML의 용도는 선언적 개체 그래프입니다. W * F 기술은이 패러다임의 훌륭한 후보이지만 XAML은 독립적으로 존재합니다.

XAML과 전체 종속성 시스템은 WF 및 WPF 용 별도의 스택으로 구현되었으므로 아마도 서로 다른 팀의 경험을 활용하여 종속성 (의도적 인 의도가 없음)을 만들지 않고이를 활용할 수있었습니다.




DependencyProperty 및 INotifyPropertyChanged는 바인딩에서 두 가지 다른 용도로 사용됩니다 : 첫 번째 속성이 바인딩 대상이되고 다른 속성에서 입력을받습니다 (속성을 설정하기 위해 {바인딩 ...} 사용). 마지막으로 속성의 값을 바인딩 원본 (바인딩 경로 식의 이름)으로 사용하려는 경우 따라서 선택은 기술적 인 것입니다.




의존성 프로퍼티는 데이터 바인딩의 소스가 아닌 UI 엘리먼트에서 (대상으로) 바인딩을 지원하기위한 것이고, 이것은 INotifyProperty가 들어있는 곳입니다. 순수한 관점에서 ViewModels에 DP를 사용하면 안됩니다.

"바인딩의 소스가 되려면 속성이 종속성 속성 일 필요는 없으며 모든 CLR 속성을 바인딩 소스로 사용할 수 있지만 바인딩 대상이 되려면 속성이 종속성 속성 단방향 또는 양방향 바인딩이 효과적이기 위해서는 원본 시스템이 바인딩 시스템 및 대상에 전파하는 변경 알림을 지원해야하며 사용자 지정 CLR 바인딩 원본의 경우이 속성이 INotifyPropertyChanged를 지원해야 함을 의미합니다. 컬렉션은 INotifyCollectionChanged를 지원해야합니다. "

모든 종속성 객체를 직렬화 할 수 없습니다 (ViewModels 및 DTO (POCO) 사용을 방해 할 수 있음).

Silverlight 내에서 WP와 WP 사이에는 차이점이 있습니다.

http://msdn.microsoft.com/en-us/library/cc221408(v=VS.95).aspx

http://msdn.microsoft.com/en-us/library/cc903933(VS.95).aspx




표현의 관점에서 볼 때, 나는 의존성 프로퍼티를 사용하는 것을 즐긴다. INotifyPropertyChanged 생각해 INotifyPropertyChanged . 이벤트 등록으로 인한 string 등록 정보 이름 및 가능한 메모리 누출 외에 INotifyPropertyChanged 는 훨씬 더 명확한 메커니즘입니다.

의존성 속성은 쉽게 이해할 수있는 정적 메타 데이터를 사용하여 "언제, 그렇게 할 것"을 암시합니다. 그것은 우아함에 대한 내 표를 얻는 선언적 접근법입니다.




Related