읽기 전용 종속성 속성(WPF .NET)

읽기 전용 종속성 속성을 사용하여 코드 외부에서 속성 값이 설정되지 않도록 할 수 있습니다. 이 문서에서는 기존 읽기 전용 종속성 속성과 사용자 지정 읽기 전용 종속성 속성을 만들기 위한 시나리오 및 기술에 대해 설명합니다.

중요

.NET 7 및 .NET 6에 관한 데스크톱 가이드 설명서는 제작 중입니다.

필수 구성 요소

이 문서에서는 독자들이 종속성 속성에 대한 기본 지식을 갖고 있으며 종속성 속성 개요를 읽었다고 가정합니다. XAML(Extensible Application Markup Language)에 익숙하고 WPF 애플리케이션을 작성하는 방법을 알고 있으면 이 문서의 예제를 따라 하는 데 도움이 됩니다.

기존 읽기 전용 종속성 속성

읽기 전용 종속성 속성은 일반적으로 상태를 보고하며 public 접근자를 통해 수정할 수 없습니다. 예를 들어 WPF(Windows Presentation Foundation) 프레임워크는 IsMouseOver 속성을 읽기 전용으로 구현합니다. 이 값은 마우스 입력을 통해서만 결정되어야 하기 때문입니다. IsMouseOver가 다른 입력을 허용할 경우 해당 값이 마우스 입력과 일치하지 않을 수 있습니다. public 접근자를 통해 설정할 수는 없지만 많은 기존 읽기 전용 종속성 속성에는 여러 입력에 의해 결정되는 값이 있습니다.

읽기 전용 종속성 속성 사용

읽기 전용 종속성 속성은 종속성 속성이 일반적으로 솔루션을 제공하는 여러 시나리오에는 적용되지 않습니다. 적용할 수 없는 시나리오에는 데이터 바인딩, 값에 스타일 적용, 유효성 검사, 애니메이션 및 상속이 포함됩니다. 그러나 읽기 전용 종속성 속성은 스타일에서 속성 트리거로 사용할 수 있습니다. 예를 들어 IsMouseOver는 일반적으로 마우스가 컨트롤 위에 있을 때 컨트롤의 배경, 전경 또는 기타 표시 속성에 대한 변경 내용을 트리거하는 데 사용됩니다. WPF 속성 시스템은 읽기 전용 종속성 속성의 변경 내용을 검색하고 보고하므로 속성 트리거 기능을 지원합니다. 읽기 전용 종속성 속성은 컬렉션 개체 자체가 아니라 컬렉션 요소만 쓸 수 있어야 하는 컬렉션 형식 종속성 속성을 구현할 때도 유용합니다. 자세한 내용은 컬렉션 형식 종속성 속성을 참조하세요.

참고

일반 공용 언어 런타임 속성이 아닌 종속성 속성만 스타일의 속성 트리거로 사용할 수 있습니다.

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

읽기 전용인 종속성 속성을 만들기 전에 적용할 수 없는 시나리오를 확인하세요.

읽기 전용 종속성 속성을 만드는 프로세스는 읽기-쓰기 종속성 속성을 만드는 것과 여러 면에서 비슷하며, 다음과 같은 차이점이 있습니다.

  • 읽기 전용 속성을 등록할 때 Register 대신 RegisterReadOnly를 호출합니다.

  • CLR 속성 래퍼를 구현할 때 공개 set 접근자가 없는지 확인합니다.

  • RegisterReadOnlyDependencyProperty 대신 DependencyPropertyKey를 반환합니다. 비공개 클래스 멤버에 DependencyPropertyKey를 저장합니다.

선택한 논리를 사용하여 읽기 전용 종속성 속성의 값을 결정할 수 있습니다. 처음에 또는 런타임 논리의 일부로 속성 값을 설정하는 데 권장되는 방법은 DependencyPropertyKey 형식의 매개 변수를 허용하는 SetValue의 오버로드를 사용하는 것입니다. 속성 시스템을 우회하고 지원 필드를 직접 설정하는 것보다 SetValue를 사용하는 것이 좋습니다.

애플리케이션 내에서 읽기 전용 종속성 속성의 값을 설정하는 방법과 위치는 DependencyPropertyKey를 저장하는 클래스 멤버에 할당하는 액세스 수준에 영향을 줍니다. 종속성 속성을 등록하는 클래스 내에서만 속성 값을 설정하는 경우 private 액세스 한정자를 사용할 수 있습니다. 종속성 속성 값이 서로 영향을 주는 시나리오의 경우 쌍을 이루는 PropertyChangedCallbackCoerceValueCallback 콜백을 사용하여 값 변경을 트리거할 수 있습니다. 자세한 내용은 종속성 속성 메타데이터를 참조하세요.

읽기 전용 종속성 속성 값을 등록하는 클래스 외부에서 변경해야 하는 경우 DependencyPropertyKey에 대해 internal 액세스 한정자를 사용할 수 있습니다. 예를 들어, 동일한 어셈블리의 이벤트 처리기에서 SetValue를 호출할 수 있습니다. 다음 예제에서는 RegisterReadOnly를 호출하여 읽기 전용 종속성 속성 FishCount를 생성하는 Aquarium 클래스를 정의합니다. DependencyPropertyKeyinternal static readonly 필드에 할당되므로 동일한 어셈블리의 코드가 읽기 전용 종속성 속성 값을 변경할 수 있습니다.

public class Aquarium : DependencyObject
{
    // Register a dependency property with the specified property name,
    // property type, owner type, and property metadata.
    // Assign DependencyPropertyKey to a nonpublic field.
    internal static readonly DependencyPropertyKey FishCountPropertyKey =
        DependencyProperty.RegisterReadOnly(
          name: "FishCount",
          propertyType: typeof(int),
          ownerType: typeof(Aquarium),
          typeMetadata: new FrameworkPropertyMetadata());

    // Declare a public get accessor.
    public int FishCount =>
        (int)GetValue(FishCountPropertyKey.DependencyProperty);
}
Public Class Aquarium
    Inherits DependencyObject

    ' Register a dependency property with the specified property name,
    ' property type, owner type, And property metadata.
    ' Assign DependencyPropertyKey to a nonpublic field.
    Friend Shared ReadOnly FishCountPropertyKey As DependencyPropertyKey =
        DependencyProperty.RegisterReadOnly(
            name:="FishCount",
            propertyType:=GetType(Integer),
            ownerType:=GetType(Aquarium),
            typeMetadata:=New FrameworkPropertyMetadata())

    ' Declare a public get accessor.
    Public ReadOnly Property FishCount As Integer
        Get
            Return GetValue(FishCountPropertyKey.DependencyProperty)
        End Get
    End Property

End Class

WPF 속성 시스템은 코드 외부에 DependencyPropertyKey를 전파하지 않으므로 읽기 전용 종속성 속성은 읽기-쓰기 종속성 속성보다 쓰기 보안이 더 뛰어납니다. DependencyPropertyKey에 대한 참조가 있는 사용자로 쓰기 액세스를 제한하려면 읽기 전용 종속성 속성을 사용합니다.

반면, 읽기-쓰기 종속성 속성에 대한 종속성 속성 식별자는 할당하는 액세스 한정자가 무엇이든 속성 시스템을 통해 액세스할 수 있습니다. 자세한 내용은 종속성 속성 보안을 참조하세요.

참고 항목