문제

Model-View-ViewModel Architecture WPF 응용 프로그램에서 ViewModel을 구현할 때 데이터를 데이터를 변경할 수있는 두 가지 주요 선택이있는 것 같습니다. 사용하는 구현을 보았습니다 DependencyProperty 속성의 경우보기가 바인딩 될 것이며 뷰 모델이 구현되는 것을 보았습니다. INotifyPropertyChanged 대신에.

내 질문은 언제 다른 하나보다 선호해야합니까? 성능 차이가 있습니까? WPF에 ViewModel 의존성을 제공하는 것이 정말 좋은 생각입니까? 설계 결정을 내릴 때 무엇을 고려해야합니까?

도움이 되었습니까?

해결책

Kent는이 주제에 대한 흥미로운 블로그를 썼습니다. 모델보기 : POCOS 대 종속성 관찰.

짧은 요약:

  1. 의존성 관점은 직렬화 가능하지 않습니다
  2. 종속성 관
  3. 종속성 관점에는 스레드 친화력이 있습니다. 생성 된 스레드에서만 액세스 할 수 있습니다.

나는 Poco 접근법을 선호합니다. inotifypropertychanged 인터페이스를 구현하는 프리젠 테이션 모델 (일명 뷰 모델)의 기본 클래스는 여기에서 찾을 수 있습니다. http://compositeextensions.codeplex.com

다른 팁

WPF Performance Guide에 따르면, 의존성 관은 inotifypropertychanged를 구현하는 Pocos보다 확실히 더 잘 수행됩니다.

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

선택은 비즈니스 로직 및 UI 추상화 수준을 기반으로합니다. 당신이 좋은 분리를 원하지 않는다면 DP가 당신을 위해 일할 것입니다.

종속성 요법은 주로 VisualElements 수준에서 적용되므로 각 비즈니스 요구 사항에 대해 많은 DP를 생성하는 경우에도 적합하지 않습니다. 또한 InotifyPropertyChanged보다 DP 비용이 더 큽니다. WPF/Silverlight를 설계 할 때 UI와 ViewModel을 완전히 디자인하려고 시도하여 언제든지 레이아웃 및 UI 컨트롤을 변경할 수 있습니다 (테마 및 스타일 기반).

이 게시물도 참조하십시오. https://stackoverflow.com/questions/275098/what-applications-could-i-study-to-understand-datamodel-view-viewmodel . 이 링크는 Model-View-ViewModel 패턴을 많이 참조 하여이 토론과 매우 관련이 있습니다.

표현력 관점에서, 나는 의존성 속성을 사용하여 철저히 즐기고 INotifyPropertyChanged. 외에 string 이벤트 구독으로 인해 속성 이름 및 가능한 메모리 누출, INotifyPropertyChanged 훨씬 더 명백한 메커니즘입니다.

의존성 속성은 "이렇게 할 때"를 쉽게 이해할 수있는 정적 메타 데이터를 사용한다는 것을 의미합니다. 우아함에 대한 투표권을 얻는 선언적 접근법입니다.

INotifyPropertyChanged 사용하면 Getters의 코드와 속성 세터에 더 많은 논리를 추가 할 수 있습니다.

DependencyProperty 예시:

public static DependencyProperty NameProperty = DependencyProperty.Register( "Name", typeof( String), typeof( Customer ) );

public String Name
{
    set { SetValue( NameProperty, value ); }
    get { return ( String ) GetValue( NameProperty ); }
}

Getter and Setter에서 --- 당신이 할 수있는 모든 것은 간단히 setValue와 getValue를 호출하는 것뿐만 아니라 프레임 워크의 다른 부분에서 getter/setter가 호출되지 않으며 대신 setValue, getValue를 직접 호출하므로 속성 로직이 아닙니다. 확실하게 실행됩니다.

와 함께 INotifyPropertyChanged, 이벤트 정의 :

public event PropertyChangedEventHandler PropertyChanged;

그런 다음 코드의 어느 곳에서나 논리가 있으면 다음을 호출하십시오.

// ...
// Something cool...
// ...

if( this.PropertyChanged != null )
{
    PropertyChanged( this, new PropertyChangedEventArgs( "Name" ) );
}

// More cool stuff that will reliably happen...

이것은 getter/setter 또는 다른 곳에있을 수 있습니다.

종속성 특성은 데이터 바인딩 소스가 아닌 UI 요소의 바인딩 (대상으로)을 지원하기위한 것입니다. 여기서 inotifyProperty가 들어오는 곳입니다. 순수한 관점에서 볼 때 뷰 모드에서 DP를 사용해서는 안됩니다.

"바인딩의 원천이 되려면 속성은 종속성 속성 일 필요가 없습니다. 모든 CLR 속성을 바인딩 소스로 사용할 수 있습니다. 그러나 바인딩의 목표가 되려면 속성은 종속성 속성. 일방 통행 또는 양방향 바인딩이 효과적이 되려면 소스 속성은 바인딩 시스템 및 대상으로 전파되는 변경 알림을 지원해야합니다. 사용자 정의 CLR 바인딩 소스의 경우, 이는 속성이 InotifyPropertyChanged를 지원해야 함을 의미합니다. 컬렉션은 inotifyCollectionChanged를 지원해야합니다. "

모든 종속성 객체는 직렬화 될 수 없습니다 (이것은 ViewModels 및 DTO (POCO)의 사용을 방해 할 수 있습니다.

WPF에 비해 Silverlight 내 DP간에 차이가 있습니다.

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 인터페이스에서 관찰자 인터페이스를 구현 한 클래스가있었습니다.

DP를 사용하면 상태를 직접 저장하는 백엔드를 정의 할 수 없습니다. 나는 .NET가 구속력이있는 모든 상태 항목의 사본을 캐시해야했을 것입니다. 이것은 불필요한 오버 헤드처럼 보였습니다. 제주는 크고 복잡합니다.

그래서 여기서 나는 inotifypropertychangangange가 비즈니스 로직에서 GUI로 속성을 노출시키는 데 더 나은 것을 발견했습니다.

재산을 노출시키기 위해 맞춤 GUI 위젯이 필요한 곳과 다른 GUI 위젯 DP에 영향을 미치기 위해 해당 속성의 변경이 간단한 솔루션을 증명했습니다.

그래서 GUI에서 GUI 알림에 DP가 유용하다는 것을 알았습니다.

WPF에 ViewModel 의존성을 제공하는 것이 정말 좋은 생각입니까?

.NET 4.0에는 system.xaml.dll이 있으므로이를 활용하기 위해 임의의 프레임 워크에 의존 할 필요가 없습니다. 보다 Rob Relyea 's 그의 PDC 세션에 대해 게시하십시오.

내 테이크

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

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

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

XAML과 전체 종속성 시스템은 WF 및 WPF에 대한 별도의 스택으로 구현되었으며, 아마도 다른 팀의 경험을 활용하지 않고 (의도하지 않은), 그 사이의 의도가 없음.

의존성 속성은 맞춤 제어 생성의 접착제입니다. XAML 설계 시간의 속성 창에 속성을 표시하기 위해 Intelli-Sense를 사용하는 데 관심이있는 경우 종속성 속성을 사용해야합니다. INPC는 설계 시간에 속성 창에 속성을 표시하지 않습니다.

종속성 속성은 버튼과 같이 생성하는 컨트롤에 사용되어야합니다. XAML에서 속성을 사용하고 모든 WPF 기능을 사용하려면 해당 속성은 종속성 속성이어야합니다.

그러나 ViewModel은 InotifyPropertyChanged를 사용하는 것이 좋습니다. inotifyPropertyChanged를 사용하면 필요한 경우 getter/setter logic을 가질 수 있습니다.

inotifyPropertyChanged를 이미 구현하는 뷰 모델에 대한 Josh Smith의 기본 클래스 버전을 확인하는 것이 좋습니다.

http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-hith-implements-inotifypropertychanged/

나는 이것이 뷰 모델을 수행하는 방법의 훌륭한 예라고 생각합니다.

나는 의존성 프로퍼티와 InotifyPropertyChanged가 바인딩에서 두 가지 다른 것들에 사용된다고 생각합니다. 첫 번째는 속성을 바인딩의 대상이되고 다른 속성으로부터 입력을받을 수있는 첫 번째는 ({binding ...}를 사용하여 마지막), 마지막입니다. 속성의 값이 바인딩의 원천으로 사용되기를 원할 때 (바인딩 경로 표현의 이름). 따라서 선택은 단순히 기술적입니다.

더 직접적인 접근 방식을 선호합니다. inotifypropertychanged가없는 프레젠테이션 모델. 데이터 바인딩 대안을 사용하여 부기 코드없이 CLR 속성에 직접 바인딩 할 수 있습니다. 보기 모델에 일반 .NET 코드를 작성하면 데이터 모델이 변경되면 업데이트됩니다.

a를 선호하는 이유는 한 가지뿐입니다 DependencyObject - 바인딩이 더 잘 작동합니다. A와 함께 예제를 시도하십시오 ListBox 그리고 TextBox, 데이터와 함께 목록을 채우십시오 INotifyPropertyChanged 재산 대 DependencyProperty 현재 항목을 편집합니다 TextBox...

다른 컨트롤에 속성을 노출 시키려면 종속성 속성을 사용해야합니다. 그러나 그들이 알아내는 데 시간이 걸리기 때문에 행운을 빕니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top