WPF에서 종속성 속성과 연결된 속성의 차이점은 무엇입니까?
WPF에서 (사용자 지정) 종속성 속성과 연결된 속성의 차이점은 무엇입니까?각각의 용도는 무엇입니까?구현은 일반적으로 어떻게 다릅니까?
연결된 속성은 종속성 속성의 한 유형입니다.차이점은 그것들이 어떻게 사용되는가에 있습니다.
속성이 연결된 경우 속성이 사용 중인 클래스와 다른 클래스에 정의됩니다.일반적으로 레이아웃에 사용됩니다.좋은 예로는 패널이 있습니다.ZIN덱스 또는 그리드.행 - 컨트롤(예: 버튼)에 적용하지만 실제로는 패널 또는 그리드에 정의되어 있습니다.속성이 단추의 인스턴스에 "연결"됩니다.
예를 들어 컨테이너는 모든 UI 요소에서 사용할 수 있는 속성을 만들 수 있습니다.
구현 차이에 대해서는 - 기본적으로 레지스터를 사용하는 것과속성을 정의할 때 첨부된 등록을 누릅니다.
추상적인
이 문제에 대한 문서를 거의 찾지 못했기 때문에 소스 코드를 뒤적이는 데 시간이 좀 걸렸지만, 여기 답이 있습니다.
종속성 속성을 "철학적" 속성 외에 종속성 속성을 정규 속성으로 등록하는 것과 첨부된 속성으로 등록하는 것 사이에는 차이가 있습니다(일반 속성은 선언 유형과 그 파생 유형에 의해 사용되도록 의도되고, 첨부된 속성은 임의의 속성에 대한 확장으로 사용되도록 의도됩니다). DependencyObject 예)."철학적", 왜냐하면, @Marque처럼.IV는 @ReedCopsey의 답변에 대한 그의 논평에서 일반 속성도 임의로 사용될 수 있다는 것을 알아차렸습니다.DependencyObject예를 들면
게다가, 저는 첨부된 속성이 "의존성 속성의 유형"이라는 다른 답변에 동의하지 않을 수 없습니다. 왜냐하면 그것은 오해의 소지가 있기 때문입니다. 의존성 속성의 "유형"이 없기 때문입니다.프레임워크는 속성이 첨부된 것처럼 등록되었는지 여부에 상관하지 않습니다. (이 정보는 관련이 없기 때문에 기록되지 않는다는 의미에서) 결정할 수도 없습니다.실제로 모든 속성은 첨부된 속성인 것처럼 등록되지만, 일반 속성의 경우 동작을 약간 수정하는 추가 작업이 수행됩니다.
코드 발췌
소스 코드를 직접 확인하는 수고를 덜기 위해, 여기에서 일어나는 일에 대한 요약 버전은 다음과 같습니다.
메타데이터가 지정되지 않은 속성을 등록할 때 호출
DependencyProperty.Register(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass))
호출과 정확히 동일한 결과를 산출합니다.
DependencyProperty.RegisterAttached(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass))
그러나 메타데이터를 지정할 때 호출
DependencyProperty.Register(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass),
typeMetadata: new FrameworkPropertyMetadata
{
CoerceValueCallback = CoerceCallback,
DefaultValue = "default value",
PropertyChangedCallback = ChangedCallback
});
호출하는 것과 같습니다.
var property = DependencyProperty.RegisterAttached(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass),
defaultMetadata: new PropertyMetadata
{
DefaultValue = "default value",
});
property.OverrideMetadata(
forType: typeof(MyClass),
typeMetadata: new FrameworkPropertyMetadata
{
CoerceValueCallback = CoerceCallback,
DefaultValue = "default value",
PropertyChangedCallback = ChangedCallback
});
결론들
일반 종속성 속성과 연결된 종속성 속성의 주요 차이점은 종속성 속성을 통해 사용할 수 있는 기본 메타데이터입니다.기본 메타데이터 속성입니다.이는 비고 섹션에도 언급되어 있습니다.
연결되지 않은 속성의 경우 속성이 원래 파생 메타데이터 유형에 등록된 경우에도 이 속성에서 반환된 메타데이터 유형을 파생된 속성 메타데이터 유형에 캐스트할 수 없습니다.원래 등록된 메타데이터를 파생된 원래 메타데이터 유형을 포함하려면 원본 등록 유형을 매개 변수로 전달하는 대신 GetMetadata(Type)를 호출합니다.
연결된 속성의 경우 이 속성에서 반환된 메타데이터 유형이 원래 연결된 등록 방법에 지정된 유형과 일치합니다.
이는 제공된 코드에서 명확하게 볼 수 있습니다.. 록방법에숨힌즉있다습니겨져트.RegisterAttached 변수의 은 메데이매변이지정입니다.defaultMetadata에 면에반에 Register은 이이나다입니다.typeMetadata연결된 속성의 경우 제공된 메타데이터가 기본 메타데이터가 됩니다. "" " " " " " " " " " " " " " " " 의 새 입니다.PropertyMetadata DefaultValue설정(제공된 메타데이터에서 또는 자동으로).다음 통화에만 해당됩니다.OverrideMetadata실제로 제공된 메타데이터를 사용합니다.
결과들
주요한 실질적인 차이점은 규칙적인 특성의 경우,CoerceValueCallback그리고.PropertyChangedCallback소유자 유형으로 선언된 유형에서 파생된 유형에만 적용되며 연결된 속성에는 모든 유형에 적용됩니다.예를 들어, 이 시나리오에서는:
var d = new DependencyObject();
d.SetValue(SomeClass.SomeProperty, "some value");
우편PropertyChangedCallback 속성이 첨부 속성으로 등록된 경우에는 호출되지만 일반 속성으로 등록된 경우에는 호출되지 않습니다.그것도 마찬가지입니다.CoerceValueCallback.
는 2차적인 는 2차적인 .OverrideMetadata제공된 형식이 다음에서 파생되어야 합니다.DependencyObject실제로 정규 속성에 대한 소유자 유형은 다음에서 파생되어야 합니다.DependencyObject연결된 속성의 경우 모든 유형(정적 클래스, 구조체, 열거형, 대리인 등)이 될 수 있습니다.
보충자료
@Marque 외에도IV의 제안, 저는 여러 번 정규 속성과 첨부 속성이 XAML에서 사용할 수 있는 방식이 다르다는 의견을 접했습니다.즉, 연결된 속성에 필요한 명시적 이름 구문과 반대로 일반 속성에는 암시적 이름 구문이 필요합니다.이것은 기술적으로는 사실이 아니지만, 실제로는 대개 그렇습니다.명확성을 위해:
<!-- Implicit property name -->
<ns:SomeClass SomeProperty="some value" />
<!-- Explicit property name -->
<DependencyObject ns:SomeClass.SomeProperty="some value" />
순수 XAML에서 이러한 구문의 사용을 지배하는 유일한 규칙은 다음과 같습니다.
- 암시적 이름 구문은 이 요소가 나타내는 클래스에 해당 이름의 CLR 속성이 있는 경우에만 요소에 사용할 수 있습니다.
- 전체 이름의 첫 번째 부분에서 지정한 클래스가 전체 이름의 두 번째 부분과 일치하는 이름을 가진 적절한 정적 get/set 메서드(액세스라고 함)를 노출하는 경우에만 요소에 명시적 이름 구문을 사용할 수 있습니다.
이러한 조건을 충족하면 백업 종속성 속성이 일반으로 등록되었는지 또는 연결되었는지에 관계없이 해당 구문을 사용할 수 있습니다.
이제 언급된 오해는 대부분의 튜토리얼(주식 Visual Studio 코드 스니펫과 함께)이 일반 종속성 속성에 CLR 속성을 사용하고 첨부된 속성에 대한 액세스 권한을 가져오거나 설정하도록 지시한다는 사실에서 발생합니다.그러나 원하는 구문을 사용할 수 있도록 두 가지를 동시에 사용하는 것을 막을 수는 없습니다.
첨부된 속성은 기본적으로 컨테이너 요소를 의미합니다.예를 들어 그리드가 있고 grid.row가 있는 경우 이 속성은 그리드 요소의 연결된 속성으로 간주됩니다. 또한 텍스트 상자, 버튼 등에서 이 속성을 사용하여 그리드에 위치를 설정할 수 있습니다.
종속성 속성은 기본적으로 다른 클래스에 속하며 다른 클래스에서 사용되는 속성과 같습니다.예: 여기에 직사각형이 있는 것처럼 높이와 너비는 직사각형의 규칙적인 속성이지만 왼쪽과 위쪽은 캔버스 클래스에 속하기 때문에 종속성 속성입니다.
첨부된 속성은 특수한 종류의 종속성 속성입니다.이 값에 대해 아무것도 모르는 개체에 값을 연결할 수 있습니다.이 개념의 좋은 예는 레이아웃 패널입니다.각 레이아웃 패널은 하위 요소를 정렬하기 위해 서로 다른 데이터가 필요합니다.Canvas는 상단과 왼쪽이 필요하고 Dock Panel은 Dock 등이 필요합니다.사용자가 직접 레이아웃 패널을 작성할 수 있으므로 목록은 무한합니다.따라서 모든 WPF 컨트롤에서 이러한 속성을 모두 가질 수는 없습니다.솔루션은 연결된 속성입니다.특정 컨텍스트에서 다른 컨트롤의 데이터가 필요한 컨트롤에 의해 정의됩니다.예를 들어, 요소는 상위 레이아웃 패널에 의해 정렬됩니다.
클래스 자체에서 첨부 속성을 정의하거나 다른 클래스에서 정의할 수 있습니다.첨부된 속성을 사용하여 표준 마이크로소프트 컨트롤을 확장할 수 있습니다.그러나 종속성 속성은 사용자가 직접 사용자 지정 컨트롤에서 정의합니다. 예를 들어 표준 컨트롤에서 컨트롤을 상속하고 사용자가 직접 컨트롤에서 종속성 속성을 정의하여 사용할 수 있습니다.이는 연결된 속성을 정의하고 표준 컨트롤에서 이 연결된 속성을 사용하는 것과 같습니다.
언급URL : https://stackoverflow.com/questions/1240699/whats-the-difference-between-a-dependency-property-and-an-attached-property-in
'programing' 카테고리의 다른 글
| C#의 저장 프로시저 출력 파라미터 사용 (0) | 2023.06.21 |
|---|---|
| 왼쪽 조인의 가장 최근 레코드 (0) | 2023.06.21 |
| 원격 저장소의 특정 버전 GitClone (0) | 2023.06.21 |
| Git 하위 모듈의 추적되지 않은 상태를 제거하는 방법은 무엇입니까? (0) | 2023.06.21 |
| C#.net 코드에서 null 변수를 SQL 저장 프로시저로 전달하는 방법 (0) | 2023.06.21 |