2013-08-12 10 views
6

나는이 모든 마법에 대해 약간은 분명하지 않다. I 종속성 속성은 DependencyObject에서 상속받을 정도로 값이 저장되어 이해 같이종속성/연결된 속성은 내부적으로 어떻게 작동하며 값은 어디에 저장됩니까?

    인스턴스 자체 값 (로컬 사전에) 할당 된 경우
  • 또는 부모 요소에 링크 찍은 값이 지정되어 있지 않은 경우.

    protected object GetValue(string propertyName) 
    { 
        if (LocalValues.ContainsKey(propertyName)) 
        { 
         return LocalValues[propertyName]; 
        } 
        return Parent.GetValue(propertyName); 
    } 
    

    이 정보가 맞습니까?

첨부 된 속성의 값은 어디에 저장되어 있는지 이해할 수 없습니까?

Control.FontSizeProperty = TextElement.FontSizeProperty.AddOwner(
typeof(Control), new FrameworkPropertyMetadata(SystemFonts.MessageFontSize, 
FrameworkPropertyMetadataOptions.Inherits)); 

AddOwner 메서드 호출에서 연결된 속성은 값을 인스턴스 필드에 할당합니까? 언제 이런 일이 일어나고 그 가치는 어디로 가게됩니까?

감사합니다.

답변

3

WPF의 속성 시스템은 꽤 복잡합니다. MSDN에는 실제로 많은 정보가 있지만 종종 찾기가 어렵습니다. While there are many ways a DependencyProperty can be set, 나는 당신이 care 값을 저장해야하는지 확신하지 않습니다.

로컬 값은 DependencyObject에 저장되어 있다고 가정 할 수 있습니다 (다시 말하면 저장 위치는 신경 쓰지 않아야 함). 문자열 기반으로 저장되지 않았 음을 유의하십시오. 실제로는 DependencyProperty의 인스턴스와 연결됩니다. 이 때문에 속성에 소유자를 추가하려고합니다. 만약 누군가가 귀하의 컨트롤에 TextElement.FontSize을 설정하면, 그것은 로컬 FontSize 속성을 설정하는 것과 같습니다.

상위의 속성 값을 상속하는 경우이 에만은 연결된 속성과 함께 발생합니다. 부터 MSDN entryFrameworkPropertyMetadataOptions에 대한 : 속성 값 상속이 nonattached 종속성 속성에 대해 작동하는 것처럼 보일 수

있지만, 런타임 트리의 특정 요소 경계를 통해 nonattached 속성에 대한 상속 동작은 정의되지 않습니다. 항상 RegisterAttached를 사용하여 메타 데이터에서 상속을 지정하는 속성을 등록하십시오.

3

종속성 속성 값은 속성 값을 적용 할 개체 (DependencyObject에서 파생 됨) 내에 저장됩니다.

이의 예를 들어 당신의 TextElement.FontSizeProperty 연결된 속성을 보자 :

... 
TextElement.SetFontSize(stackPanel, 20); 
... 

내부입니다 :

<StackPanel TextElement.FontSize="20" ... > 
    ... 
</StackPanel> 

XAML 파서는 다음에 번역 그래서

public static void SetFontSize(DependencyObject element, double value) 
{ 
    element.SetValue(TextElement.FontSizeProperty, value); 
} 

, TextElement를 설정합니다.stackPanel 객체의 FontSize는

과 같습니다.
stackPanel.SetValue(TextElement.FontSizeProperty, value) 

SetValue()는 DependencyObject 클래스에 정의 된 메서드입니다. 메서드 내에서 여러 가지 복잡한 일이 발생하지만 결국에는 종속성 속성의 유효 값이 EffectiveValueEntry라는 구조체에 래핑되고 DependencyObject 내부의 다음 인스턴스 필드에 저장됩니다.

private EffectiveValueEntry[] _effectiveValues;