2011-09-22 28 views
0

總之,我們正在創建一個僅適用於FrameworkElement或其子類之一的附加屬性。我們想要的是如果它被應用於任何不是的東西的話,就會阻止這個集合。對於WPF AttachedProperty,您可以根據您附加的類型驗證值嗎?

現在我們不能使用ValidateValueCallback,因爲只傳遞屬性的值,而不是您將屬性附加到的值。

同樣,我們不能使用PropertyChangedCallback因爲值已經被設置在這一點上,和NewValue是隻讀的,由於某種原因,我們不能得到ClearValue爲「棒」裏面。

那麼...無論如何要做我們想要的?

回答

1

呃!它不是ValidateValueCallback,它是CoerceValueCallback,因爲它給你的對象!完成並完成!

UPDATE

從頭開始的。這實際上並不是100%正確的,因爲我忘記了價值優先。

MSDN: Dependency Property Value Precedence

換句話說,它仍然實際設置,但它只是被迫再次回到默認值,這意味着在我們的情況下,「未設置」。該死的。

我開始認爲唯一真正的方法就是在PropertyChangedCallback的範圍內拋出一個InvalidOperationExcepton,但我不確定哪怕100%都能正常工作,因爲我相信這個值已經設置了一次你在裏面。

我會盡快與您聯繫。保持答案即將到來!

0

是的,這是可能的 - 但你通過控制第一個參數的類型在Get和Set方法中做到這一點。如果你只想要FrameworkElements能夠獲取或設置值,那麼你只能在get和set方法中使用框架元素。這將防止非骨架元素從能夠通過XAML

public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached(...) 

public static bool GetMyProperty(FrameworkElement e) 
{ 
    return (bool)e.GetValue(MyPropertyProperty); 
} 
public static void SetMyProperty(FrameworkElement e, bool value) 
{ 
    e.SetValue(MyPropertyProperty, value); 

}

+0

這並不工作設定值。那麼它的部分原因是它會阻止它在XAML中設置(它會在運行時拋出異常),您仍然可以通過代碼隱藏設置它,因爲您可以繞過CLR獲取器和設置器。這就是爲什麼你不應該在這些方法中放置任何邏輯 - 不能保證它們會被使用。它們只是爲了方便直接從代碼中調用,但可以通過直接簡單地調用e.SetValue(MyPropertyProperty,value)來輕鬆繞過 – MarqueIV

相關問題