2009-06-26 2 views
5

종속성 속성에 대한 좋은 이유를 파악하는 데 어려움을 겪고 있습니다. System.Controls.TextBox "Text"속성이 종속 속성이 아닌 일반 속성이 아닌 이유는 무엇입니까? 의존성 속성이되면 어떤 이점이 있습니까?종속성 속성 WPF에서 사용

내가 수행하려고하는 것 중 하나는 다른 유효성 검사 규칙이 포함될 UserControl에 ValidationRules 속성을 추가하는 것입니다. 여기처럼 :

<customControls:RequiredTextBox.ValidationRules> 
         <validators:NotNullOrEmptyValidationRule ErrorMessage="FirstName cannot be null or empty"/> 
        </customControls:RequiredTextBox.ValidationRules> 

ValidationRules 속성이 DependencyProperty인지 아니면 일반 속성이어야하는지 여부는 잘 모르겠다. 여기

{"Cannot add element to 'ValidationRules'; the property value is null. Error at object 'LearningWPF.ValidationRules.NotNullOrEmptyValidationRule' in markup file 'LearningWPF;component/addcustomerwindow.xaml' Line 35 Position 66."} 

을 ValidationRules 속성입니다 :

위의 코드는 다음과 같은 오류를 제공합니다 당신이 속성 값을 채우는 데 바인딩을 사용하려는 경우 종속성 속성이 필요합니다

public static readonly DependencyProperty ValidationRulesProperty = 
      DependencyProperty.Register("ValidationRules", 
             typeof (Collection<ValidationRule>), typeof (RequiredTextBox), 
             new FrameworkPropertyMetadata(null)); 

     public Collection<ValidationRule> ValidationRules 
     { 
      get { return (Collection<ValidationRule>)GetValue(ValidationRulesProperty); } 
      set { SetValue(ValidationRulesProperty, value); } 
     } 
+0

ValidationRules는 어떤 유형입니까? 컬렉션 유형에 개체를 추가하려고하지만 컬렉션을 인스턴스화하지 않은 것 같습니다. –

+0

게시물을 업데이트했습니다! – azamsharp

+0

항목을 추가하기 전에 컬렉션을 인스턴스화해야합니다. RequiredTextBox 클래스의 생성자에서 다음을 추가합니다. ValidationRules = new Collection (); 이제 xmal을 통해 항목을 추가 할 수 있습니다. –

답변

8

이점은 주로 두 배 :

첫째가 사용되는 경우에만 생성되는 종속성 속성이는 실제의 최소한의 번호를 가지고 있기 때문에 텍스트 상자 클래스가 낮은 메모리 풋 프린트, 매우 효율적 수 있다는 것을 의미합니다 속성은 힙에서 공간을 차지합니다. 이는 WPF에서 모든 컨트롤이 점점 더 특정 유형의 컬렉션 일 때 특히 중요합니다. 만약 그 내부의 타입이 행동을 정의하기 위해 수십 개의 속성을 선언했다면, 버튼처럼 높은 레벨의 컨트롤은 100 개의 속성으로 이루어진 클래스의 크기를 갖게 될 것입니다.

두 번째로 종속성 속성은 생성 된 형식 이외의 개체에 연결할 수 있습니다. 그리드 컨트롤이 읽고 레이아웃에 사용할 수있는 Grid.Column 속성을 컨트롤이 설정할 수있는 경우를 허용합니다. 이것은 우리가 다른 컨트롤에 필요한 작은 기능을 제공하는 수백 개의 데코레이터 클래스가 아니라는 것을 의미합니다. 이것은 xmal이 훨씬 더 직관적이고 읽기 쉽다는 것을 의미합니다. 수정 된 문제의 예를 해결하기 위해


편집 :

유효성 검사 속성 지금까지 내가 할 수있는 기본적으로 모든 해답의 이유 중 종속성 속성 (인에서 많은 혜택을 얻을 수는 없지만 메모리 발자국에 대한 내 의견이 실제로 나올뿐입니다.) 텍스트 상자의 Text 속성을 바인딩하거나 다른 속성을 기반으로 변경할 수 있으므로 분명히 이점이 없습니다 입력, 나는 여전히 의존성 속성으로 그것을 구현합니다. 이것에 대한 나의 추론은 간단합니다. 당신은별로 이득을 얻지 못했지만, 비용도 들지 않습니다. 커스텀 컨트롤에서 기본 속성을 사용하기를 바랬던 적은 없었습니다. 필자가 처음 쓰기를 시작했을 때, 필자는 기본 속성을 의존성으로 지속적으로 업그레이드 했었습니다. 몇 가지 추가 기능.

간단히 말하면, 종속성 속성은 일반 속성을 정의하는 것이 더 복잡하지만 달리해야 할 적절한 이유가없는 한 WPF 컨트롤의 사실상 표준으로 여전히 사용합니다. 필드가 구현하기가 더 쉽지만 속성이 클래스의 표준입니다.내가 말할 것

+0

업데이트 된 게시물을 확인하십시오! – azamsharp

+0

더 나은 생각을 가지기 위해 사용자 지정 컨트롤에 포함시킬 종속성 속성 몇 가지를 나열 할 수 있습니까? – azamsharp

2

. 단지 일반 속성 인 경우 Text 속성을 View Model 객체의 속성에 바인딩 할 수 없습니다.

5

주요 장점은 다음과 같습니다

  1. 일류 데이터 바인딩을 지원합니다.
  2. 첨부 된 속성 의미 정리
  3. "종속적 인"속성 값. 마지막 포인트는 것을

종속성 속성 전에, 값을 갖는 로컬 값, 애니메이션 값 재정의 값, styleable 값, templatable 값이 복수의 선언을 필요가 등록 정보/필드/사전 항목뿐만 아니라 복잡한 상태 + 선행 관리.

종속성 속성을 사용하면 이러한 모든 기능을 사용할 수 있으며 ONE 속성 만 선언 할 수 있습니다.

귀하의 경우, 이러한 기능을 사용할 필요가 없다면 귀하의 ValidationRules를 DependencyProperty로 선언하고 싶지 않을 수도 있습니다.

그렇다면 컬렉션에 대해 다른 처리 방법 (예 : 비어 있지 않은 컬렉션)을 사용하는 것이 좋습니다. 이 특정 예에서는 Reflector를 사용하고 .NET TextBox에서 유효성 검사 컬렉션을 구현하는 방법을 확인하고 코드를 다시 사용하거나 복사 할 수 있는지 확인합니다.

특정가 아니라면 휠을 다시 발명 할 필요가 없습니다. 내 개인적인 경험은 내 재발견 된 바퀴가 물건을 잃어 버리는 경향이 있다는 것입니다.).

Martin Harris가 이미 지적했듯이 DependencyProperties는 속성 값을 사전에 던져서 메모리 사용량을 제한 할 수 있지만 DependencyProperties가 출현하기 전에 MSFT가 수행 할 수 있습니다.

Martin도 Attached Properties를 언급하지만, DependencyProperties가 출현하기 전에는 (적어도 디자이너에서는) 사용할 수있었습니다. DependencyProperties를 사용하는 Attached Property 구현은 훨씬 깔끔합니다.