2012-11-19 1 views
1

이것이 종속성 속성을 관리하는 방법에 대한 기본적인 오해라고 생각하지만 명확한 예를 찾을 수없는 것 같습니다. 내가 만약 내가 이해하지 못하는 어떤 예를 들어 다음 코드를 보면 DependencyProperty 값 및 변경된 콜백의 내부 관리

...

public class MyControl 
{ 
    public static readonly DependencyProperty ExpressionProperty = 
            DependencyProperty.Register("Expression", 
            typeof (Expression), 
            typeof (MyControl), 
            new PropertyMetadata(ExpressionChanged)); 

    public Expression Expression 
    { 
     get { return (Expression)GetValue(ExpressionProperty); } 
     set { SetValue(ExpressionProperty, value); } 
    } 

    private static void ExpressionChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     ... Must respond to external change of property 
     ... Update UI to reflect external change to property 
    } 

    private void RespondToInput() 
    { 
     ... Do something to expression, add new elements or something 
     ... Now expression has changed so I want to update the dependency property 
     ... so datacontext gets new value. 
     SetValue(ExpressionProperty, updatedExpression); 
    } 
} 

, 나는이 RespondToInput 작업을 수행 할 때, 내가 지금하는 DependencyProperty를 업데이트 할 것입니다 만, PropertyChanged 콜백이 호출됩니다.이 시점에서 UI에서 변경 사항을 효과적으로 초기화했지만 원을 그리며 UI 업데이트를 시작합니다.

충분한 의미가 있는지 나는 모른다.

내가 뭘 잘못 했니 ??

감사합니다.

+0

. DependencyProperty에 대한'ownerType' 인수를'ExpressionRichTextBox'에 등록하십시오. 속성은 클래스'MyControl'에 정의되어 있습니다. – Clemens

+0

죄송합니다, 오타! 고마워! – Adam

답변

1

속성 값이 변경 될 때 PropertyChangedCallback이 호출되지 않도록 할 수 없습니다. 당신이 할 수있는 것은 내부 속성 변화에 반응하지 입니다 : 그냥 오타 아마

private bool isInternalExpressionChanged; 

private static void ExpressionChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
{ 
    if (!isInternalExpressionChanged) 
    { 
     ... 
    } 
} 

private void RespondToInput() 
{ 
    ... 
    isInternalExpressionChanged = true; 
    SetValue(ExpressionProperty, updatedExpression); 
    isInternalExpressionChanged = false; 
} 
+0

그게 정확히 내가 한 짓이지만, 모든 잘못을 느낀다. 나는 공공 재산, 의존성 재산 및 가치의 내부 관리를 어떻게 처리해야하는지 정확하게 이해하지 못한다고 생각합니다. 아마 그것이 유일한 방법 일 것입니다, 그것은 일반적인 합의입니까? – Adam

+0

"public property"*는 종속성 속성이며 (응용 프로그램 코드에서) * 내부 값 *입니다. 당신은 단순히 구별 할 수 없습니다. – Clemens

+0

내가했던 것과 똑같은 접근법을 생각해 냈기 때문에 기쁘다. 아직도 옳지 않은 것처럼 느껴진다.하지만 효과가있다. 도움/보증에 감사드립니다. – Adam

관련 문제