읽기 전용 종속성 속성

이 항목에서는 기존 읽기 전용 종속성 속성과 사용자 지정 읽기 전용 종속성 속성을 만드는 시나리오 및 방법을 포함하여 읽기 전용 종속성 속성을 설명합니다.

필수 구성 요소

이 항목에서는 종속성 속성을 구현하는 기본 시나리오와 메타데이터가 사용자 지정 종속성 속성에 적용되는 방법을 이해하고 있다고 가정합니다. 컨텍스트는 사용자 지정 종속성 속성종속성 속성 메타데이터를 참조하세요.

기존 읽기 전용 종속성 속성

WPF(Windows Presentation Foundation) 프레임워크에 정의된 일부 종속성 속성은 읽기 전용입니다. 일반적으로 읽기 전용 종속성 속성을 지정하는 이유는 상태 결정에 이러한 속성을 사용해야 하지만 많은 요소가 해당 상태에 영향을 미치는 경우 속성을 해당 상태로 설정하는 것은 사용자 인터페이스 디자인 측면에서 바람직하지 않기 때문입니다. 예를 들어 속성 IsMouseOver는 실제로 마우스 입력에 따라 결정되는 표시 상태입니다. 실제 마우스 입력을 우회하여 프로그래밍 방식으로 이 값을 설정하는 시도는 예측이 불가능하고 이로 인해 불일치가 발생합니다.

설정이 불가능하기 때문에 읽기 전용 종속성 속성은 정상적으로는 종속성 속성이 솔루션(값, 유효성 검사, 애니메이션, 상속에 직접 스타일 지정 가능한 데이터 바인딩)을 제공하는 많은 시나리오에 적절하지 않습니다. 설정 불가능하지만 읽기 전용 종속성 속성에는 속성 시스템의 종속성 시스템을 통해 지원되는 몇 가지 추가 기능이 있습니다. 가장 중요한 나머지 기능은 읽기 전용 종속성 속성은 속성 트리거로 사용될 수 있다는 것입니다. 일반 CLR(공용 언어 런타임) 속성을 사용하여 트리거를 사용하도록 설정할 수는 없습니다. 종속성 속성이어야 합니다. 앞에서 언급한 IsMouseOver 속성은 컨트롤의 스타일을 정의하는 데 매우 유용한 시나리오의 완벽한 예입니다. 이 시나리오에서는 사용자가 컨트롤의 정의된 영역 위에 마우스를 놓을 때 복합 요소의 배경, 전경 또는 비슷한 속성과 같은 일부 표시 가능한 속성이 변경됩니다. 읽기 전용 종속성 속성의 변경 내용은 속성 시스템의 기본 무효화 프로세스를 통해 검색 및 보고할 수 있고, 실제로 속성 트리거 기능을 내부적으로 지원합니다.

사용자 지정 읽기 전용 종속성 속성 만들기

위 섹션에서 읽기 전용 종속성 속성이 많은 일반적인 종속성 속성 시나리오에 적용되지 않는 이유를 확인해야 합니다. 하지만 적절한 시나리오가 있는 경우 자체 읽기 전용 종속성 속성을 만들려고 할 수 있습니다.

읽기 전용 종속성 속성을 만드는 프로세스의 많은 부분은 사용자 지정 종속성 속성종속성 속성 구현 항목에 설명된 것과 같습니다. 세 가지 중요한 차이점이 있습니다.

  • 속성을 정의할 때 속성 등록을 위한 일반 Register 메서드 대신 RegisterReadOnly 메서드를 호출합니다.

  • CLR "래퍼" 속성을 구현할 때 래퍼에도 집합 구현이 없는지 확인하세요. 그래야 읽기 전용 상태에서 표시하는 public 래퍼에 대한 불일치가 없습니다.

  • 읽기 전용 등록이 반환하는 개체는 DependencyProperty가 아니라 DependencyPropertyKey입니다. 이 필드는 멤버로 저장해야 하지만 일반적으로 형식의 public 멤버로 설정하지 않습니다.

지원하는 private 필드 또는 값이 무엇이든 관계없이 읽기 전용 종속성 속성은 결정한 논리가 무엇이든 이를 사용하여 충분히 쓰기 가능합니다. 하지만 처음에 또는 런타임 논리의 일부로 속성을 설정하는 가장 직관적인 방법은 속성 시스템을 우회하고 private 지원 필드를 직접 설정하는 것이 아니라 속성 시스템의 API를 사용하는 것입니다. 특히 DependencyPropertyKey 형식의 매개 변수를 수락하는 SetValue의 서명이 있습니다. 애플리케이션 논리 내에서 이 값을 프로그래밍 방식으로 설정하는 방법과 위치는 종속성 속성을 처음 등록할 때 만들어진 DependencyPropertyKey에서 액세스를 설정하는 방법에 영향을 미칩니다. private로 설정할 수 있는 클래스 내에서 이 논리를 모두 처리할 경우 또는 어셈블리의 다른 부분에서 클래스를 설정해야 하는 경우 이 클래스를 internal로 설정할 수 있습니다. 한 가지 방법은 저장된 속성 값을 변경해야 함을 클래스 인스턴스에 알리는 관련 이벤트의 클래스 이벤트 처리기 내에서 SetValue를 호출하는 것입니다. 또 다른 방법은 등록 중에 페어링된 PropertyChangedCallbackCoerceValueCallback 콜백을 종속성 속성 메타데이터의 일부로 사용하여 이러한 속성을 서로 연결하는 것입니다.

DependencyPropertyKey가 private이고 코드 외부에서 속성 시스템을 통해 전파되지 않으므로 읽기 전용 종속성 속성은 읽기-쓰기 종속성 속성보다 보안 설정 기능이 더 강력합니다. 읽기-쓰기 종속성 속성의 경우 식별 필드는 명시적 또는 암시적으로 public이므로 속성을 광범위하게 설정할 수 있습니다. 자세한 내용은 종속성 속성 보안을 참조하세요.

참고 항목