sourcetip

속성이 변경되었음을 알립니다.뷰 모델의 종속성 속성

fileupload 2023. 5. 13. 10:43
반응형

속성이 변경되었음을 알립니다.뷰 모델의 종속성 속성

모델-뷰-뷰 모델 아키텍처 WPF 애플리케이션에서 View 모델을 구현할 때 데이터 바인딩을 가능하게 하는 방법에는 두 가지 주요 선택 사항이 있는 것 같습니다.는 를사하구본적있습다니이현을을 사용하는 본 적이 .DependencyProperty에 대해 모델이 View를 하는 것을 .INotifyPropertyChanged대신.

제 질문은 제가 언제 다른 것보다 어느 것을 더 선호해야 하는가 하는 것입니다.성능에 차이가 있습니까?View Model 종속성을 WPF에 부여하는 것이 정말 좋은 생각입니까?디자인 결정을 내릴 때 고려해야 할 사항은 무엇입니까?

Kent는 이 주제에 대해 흥미로운 블로그를 썼습니다.모델 보기: POCO종속성 개체.

요약:

  1. 종속성 개체가 직렬화 가능으로 표시되지 않음
  2. DependencyObject 클래스는 Equals() 및 GetHashCode() 메서드를 재정의하고 봉인합니다.
  3. 종속성 개체에 스레드 선호도가 있습니다. 종속성 개체는 해당 개체가 생성된 스레드에서만 액세스할 수 있습니다.

저는 POCO 방식을 선호합니다.INOTIFY를 구현하는 프레젠테이션 모델(ViewModel)의 기본 클래스PropertyChanged 인터페이스는 http://compositeextensions.codeplex.com 에서 확인할 수 있습니다.

WPF 성능 가이드에 따르면 종속성 개체는 INOTIFY를 구현하는 POCO보다 확실히 성능이 우수합니다.변경된 속성:

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

선택은 전적으로 귀사의 비즈니스 로직과 UI 추상화 수준을 기반으로 합니다.만약 당신이 좋은 분리를 원하지 않는다면, DP는 당신을 위해 일할 것입니다.

종속성 속성은 주로 VisualElements 수준에서 적용되므로 각 비즈니스 요구 사항에 대해 많은 DP를 생성하는 것은 좋지 않습니다.또한 INOTIFY보다 DP 비용이 더 많이 듭니다.속성이 변경되었습니다.WPF/Silverlight를 설계할 때 언제든지 레이아웃 및 UI 컨트롤을 변경할 수 있도록 UI와 View Model을 완전히 별도로 설계합니다(테마 및 스타일 기준).

이 게시물도 참조하십시오 - https://stackoverflow.com/questions/275098/what-applications-could-i-study-to-understand-datamodel-view-viewmodel .링크에는 모델-뷰-뷰 모델 패턴에 대한 많은 참조가 있으며, 이는 이 논의와 매우 관련이 있습니다.

표현력의 관점에서, 저는 의존성 속성을 사용하는 것을 완전히 즐기고 다음과 같은 생각에 움츠러듭니다.INotifyPropertyChanged▁▁apart외.string 속성 및 , 속성이및로인한누가수능성,INotifyPropertyChanged훨씬 더 명확한 메커니즘입니다.

종속성 속성은 쉽게 이해할 수 있는 정적 메타데이터를 사용하여 "이 경우, 이를 수행하십시오"를 의미합니다.그것은 우아함에 대한 저의 표를 얻는 선언적 접근법입니다.

종속성 속성은 데이터 바인딩에 대한 소스가 아닌 UI 요소에 대한 바인딩(대상)을 지원하기 위한 것입니다. 여기서 INNotify재산이 들어옵니다.순수한 관점에서 View Model에서 DP를 사용하면 안 됩니다.

"바인딩의 소스가 되려면 속성이 종속성 속성일 필요가 없습니다. CLR 속성을 바인딩 소스로 사용할 수 있습니다.그러나 바인딩의 대상이 되려면 속성이 종속 속성이어야 합니다.단방향 또는 양방향 바인딩을 적용하려면 소스 속성이 바인딩 시스템과 대상에 전파되는 변경 알림을 지원해야 합니다.사용자 지정 CLR 바인딩 소스의 경우 속성이 INOTIFY를 지원해야 함을 의미합니다.속성이 변경되었습니다.컬렉션은 변경된 INOTIFY Collection을 지원해야 합니다."

모든 종속성 개체를 직렬화할 수는 없습니다(이로 인해 ViewModel 및 DTO(POCO)의 사용이 방해될 수 있습니다).

Silverlight 내의 DP는 WPF와 비교하여 차이가 있습니다.

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

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

INotifyPropertyChanged또한 이 기능을 사용하면 getter 및 setter의 코드에 논리를 추가할 수 있습니다.

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와 setter에서 --- 단순히 SetValue와 GetValue를 각각 호출하면 프레임워크의 다른 부분에서 b/c를 호출하지 않고 대신 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...

이것은 게터/세터 또는 다른 곳에 있을 수 있습니다.

View Model 종속성을 WPF에 부여하는 것이 정말 좋은 생각입니까?

.NET 4.0에는 시스템이 포함됩니다.Xaml.dll을 사용하면 임의 프레임워크에 의존하지 않아도 됩니다.PDC 세션에 대한 Rob Relieea의 게시물을 참조하십시오.

내 생각엔

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

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

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

XAML과 전체 종속성 시스템은 WF와 WPF를 위한 별도의 스택으로 구현되었으며, 아마도 서로 다른 팀 간에 종속성(장난 의도 없음)을 만들지 않고 서로 다른 팀의 경험을 활용하기 위한 것으로 보입니다.

저도 최근에 이 결정을 고려해야 했습니다.

제가 발견한 것은 정보통보가PropertyChanged 메커니즘은 중복 상태 없이 기존 비즈니스 로직 프레임워크에 GUI를 결합할 수 있게 해 주었기 때문에 제 요구사항에 더 적합했습니다.제가 사용하던 프레임워크는 자체 관찰자 패턴을 가지고 있어서 한 수준의 알림을 다음 단계로 전달하는 것이 쉬웠습니다.비즈니스 로직 프레임워크와 INOTIFY에서 옵저버 인터페이스를 구현하는 수업을 수강했습니다.속성이 변경된 인터페이스입니다.

DP를 사용하면 상태를 직접 저장하는 백엔드를 정의할 수 없습니다..net이 제가 바인딩하고 있는 모든 상태 항목의 복사본을 캐시하도록 해야 했습니다.이것은 불필요한 간접비처럼 보였습니다. 제 주는 크고 복잡합니다.

그래서 여기서 I notify를 찾았습니다.속성 변경: 비즈니스 논리에서 GUI로 속성을 노출하는 데 더 효과적입니다.

속성을 노출하고 해당 속성의 변경 사항이 다른 GUI 위젯 DP에 영향을 미치기 위해 사용자 지정 GUI 위젯이 필요한 곳에서 언급된 것은 간단한 솔루션을 입증했습니다.

그래서 저는 DP가 GUI에서 GUI 알림에 유용하다는 것을 알게 되었습니다.

종속성 속성은 사용자 지정 제어 생성의 접착제입니다.Intelli-sense를 사용하여 XAML 설계 시 속성 창에 속성을 표시하려면 Dependency 속성을 사용해야 합니다.INPC는 설계 시 속성 창에 속성을 표시하지 않습니다.

종속성 속성은 단추와 같은 사용자가 생성하는 컨트롤에서 사용해야 합니다.XAML에서 속성을 사용하고 모든 WPF 기능을 사용하려면 이러한 속성이 종속성 속성이어야 합니다.

그러나 View Model은 INOTIFY를 사용하는 것이 좋습니다.속성이 변경되었습니다.정보 알림 사용PropertyChanged는 필요한 경우 getter/setter 로직을 사용할 수 있는 기능을 제공합니다.

이미 INOTIFY를 구현한 ViewModel의 기본 클래스에 대한 Josh Smith 버전을 확인하는 것이 좋습니다.변경된 속성:

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

이것이 View Model을 수행하는 방법에 대한 훌륭한 예라고 생각합니다.

종속성 속성 및 정보를 알려주는 것 같습니다.PropertyChanged는 Binding에서 두 가지 다른 용도로 사용됩니다. 첫 번째는 속성이 바인딩의 대상이 되고 다른 속성에서 입력을 수신할 수 있도록 하기 위한 것입니다({Binding... 사용).속성을 설정하기 위해), 속성 값을 바인딩의 원본으로 사용할 마지막 시점(바인딩 경로 식의 이름)입니다.그래서 선택은 단지 기술적인 것입니다.

저는 좀 더 직접적인 접근 방식을 선호합니다. 이 방식은 알림 없이 프레젠테이션 모델에서 블로그에 올렸습니다.속성이 변경되었습니다.데이터 바인딩 대신 부기 코드 없이 CLR 속성에 직접 바인딩할 수 있습니다.당신은 그냥 평범한 글을 쓰시는군요.View 모델의 NET 코드는 데이터 모델이 변경될 때 업데이트됩니다.

단지 한 가지를 선호하는 이유가 있습니다.DependencyObject바인딩이 더 잘 작동할 것입니다.예를 들어 보겠습니다.ListBox그리고.TextBox의 목록.INotifyPropertyChanged속성 대. DependencyProperty 재항목편위에서 을 편집TextBox...

속성을 다른 컨트롤에 표시하려면 종속성 속성을 사용해야 합니다...하지만 행운을 빌어요 그들이 알아내는데 시간이 좀 걸리니까요...

언급URL : https://stackoverflow.com/questions/291518/inotifypropertychanged-vs-dependencyproperty-in-viewmodel

반응형