2012-11-19 46 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

也許只是一個錯字。雖然該屬性是在MyControl類中定義的,但您可以將'ownerType'參數設置爲DependencyProperty.Register到'ExpressionRichTextBox'。 – 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

「公共財產」*是*依賴性屬性和(從應用程序代碼)*是內部值。你根本無法區分。 – Clemens

+0

我很高興你想出了和我一樣的方法,至少我並沒有完全脫離基地。它仍然覺得它不太對,但它確實有效,所以現在一切都好!感謝您的幫助/保證。 – Adam