[英]How is a class that inherits DependencyObject used?
我從這里開始關注Dependency Object的教程: http : //tech.pro/tutorial/745/wpf-tutorial-introduction-to-dependency-properties
然而,我仍然有些困惑。 我創建了以下類,這純粹是出於我自己的學習目的,並沒有真正的用法:
namespace DPTest
{
class Audio : DependencyObject
{
public static readonly DependencyProperty fileTypeProperty = DependencyProperty.Register("fileType", typeof(String), typeof(Audio),
new PropertyMetadata("No File Type", fileTypeChangedCallback, fileTypeCoerceCallback), fileTypeValidationCallback);
public String fileType
{
get
{
return (String)GetValue(fileTypeProperty);
}
set
{
SetValue(fileTypeProperty, value);
}
}
private static void fileTypeChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
Console.WriteLine(e.OldValue + " - " + e.NewValue);
}
private static object fileTypeCoerceCallback(DependencyObject obj, object o)
{
String s = o as String;
if (s.Length > 0)
{
s = s.Substring(0, 8);
}
return s;
}
private static bool fileTypeValidationCallback(object value)
{
return value != null;
}
}
}
幾個問題:
如果您使用Model-View-ViewModel ,那么您可能不需要DependencyObject,但要回答您的具體問題:
DependencyProperty 定義是靜態的,因為DependencyObject的所有實例都共享定義。 它們就像是一個每個對象屬性更高的字典 。 這還允許各種框架功能無縫地工作,例如綁定或呈現更新 。
當您需要將屬性的更改鏈接在一起時,會發生DependencyProperty強制 。 例如,如果您有一個Slider控件,其值應該在最小值和最大值之間,則使用CoerceValue回調來確保它保持在適當的范圍內。
DependencyObjects在用戶代碼中已經失寵,而在很大程度上被WPF開發中的Model-View-ViewModel模式取代。 你仍然會發現DependencyObjects在自定義控件開發中。 DependencyProperties在用戶代碼中很常見,通常采用附加屬性的形式。
依賴項屬性本身是靜態的,因為您將屬性分配給對象類型。 它將屬性標識為一個整體,並不僅僅像CLR屬性那樣捕獲值。
正如您在(非靜態)CLR屬性中看到的那樣,存儲功能僅由SetValue
和GetValue
處理。 您可以將依賴項屬性值想象為一個大字典,您只需將一些任意內容放入其中。 字典的關鍵是依賴屬性。
強制回調用於將值強制為某種格式。 在您的情況下,它將確保該字符串只有8個字符長。 大多數情況下,您不需要這樣的回調。 您甚至不需要經常更改屬性的屬性。 最常見的情況是可綁定屬性,只需使用標准元數據定義依賴屬性即可。
你的課程的目的是作為一個例子我猜。 如果您沒有特定的用例,我建議您甚至不要查看依賴項對象。 實際上很少將子類型DependencyObject
本身。 通常,您有一個框架元素或組件,您可以繼承並向其添加自定義行為。 然后,只要您需要XAML等的可綁定屬性,就需要依賴屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.