2009-06-17 19 views
1

我碰到一個奇怪的問題,在那裏,當我在調用RegisterAttached和名稱指定屬性的名稱正確的附加屬性的名稱附加屬性(比如TranslateProperty和「翻譯「)所附屬性實現的代碼不會觸發。只是不叫。如果我將字符串名稱更改爲除Translate之外的任何內容(比如「Translate_」),代碼就會被調用。RegisterAttached字符串屬性名造成AttachedProperty不火

這裏的實現:

公共類TranslateExtension:DependencyObject的 {

public static readonly DependencyProperty TranslateProperty = 
    DependencyProperty.RegisterAttached("Translate_", 
             typeof(bool), 
             typeof(TranslateExtension), 
             new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); 

public static void SetTranslate(UIElement element, bool value) 
    { 
     AssignKeys(element); 
     element.SetValue(TranslateProperty, value); 
    } 
    public static bool GetTranslate(UIElement element) 
    { 
     return (bool)element.GetValue(TranslateProperty); 
    } 

    public bool Translate 
    { 
     set { base.SetValue(TranslateProperty, value); } 
    } 
    ... 
} 

以上實際工作,因爲字符串中的屬性是Translate_。如果我將字符串值更改爲「Translate」,則失敗。

我在同一個班2個附加屬性,它們表現出完全一樣的行爲 - 相同的名稱AttachedProperty,他們不會被調用。將其命名爲其他內容並且可以工作。

我不確定這裏發生了什麼事。我的代碼實際上使用了無效的名稱,但我不明白爲什麼,更重要的是,我不確定這個錯誤的命名是否會導致任何副作用。

任何人都可以看到我是否忽視的東西非常明顯?我重新訪問了AttachedProperties文章中的幾個例子,我沒有看到使用特殊名稱的實現 - 它們總是將字符串屬性命名爲與附加屬性相同。

回答

2

你不應該把額外的代碼在您的SetTranslate,因爲它不會被調用。從MSDN here

啓示自定義依賴屬性

因爲對於 屬性設置的XAML處理器行爲的當前WPF實現 繞過 完全,你不應該把任何 附加邏輯包裝進入 自定義依賴屬性的包裝的定義 。如果你把 這樣的邏輯在集定義,然後 邏輯不會當 屬性在XAML設置而 不是在代碼執行。

類似地,XAML 處理器的其它方面在於獲得從XAML處理屬性值 也使用的GetValue 而不是使用包裝。 因此,你也應該避免在超越的GetValue調用get 定義的任何 附加的實現。

相反,將一個PropertyChangedCallback添加到您的FrameworkPropertyMetadata。

+0

是的,這就是它!將PropertyChangedCallback()添加到新的FrameworkMetaData()構造函數中有訣竅。 我仍然想知道爲什麼有一個無效名稱(如「Translate_」)會觸發SetTranslate方法來調用。這真是奇怪的行爲。 – 2009-06-17 22:02:08