簡體   English   中英

如何使用繼承DependencyObject的類?

[英]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;
        }
    }
}

幾個問題:

  1. 為什么財產是靜態的? 我不完全理解它是否意味着在對象級別存儲一個值。
  2. Coerce回調做了什么以及為什么包含它?
  3. 我班級的目的是什么,我會在哪里使用它?

如果您使用Model-View-ViewModel ,那么您可能不需要DependencyObject,但要回答您的具體問題:

  1. DependencyProperty 定義是靜態的,因為DependencyObject的所有實例都共享定義。 它們就像是一個每個對象屬性更高的字典 這還允許各種框架功能無縫地工作,例如綁定或呈現更新

  2. 當您需要將屬性的更改鏈接在一起時,會發生DependencyProperty強制 例如,如果您有一個Slider控件,其值應該在最小值和最大值之間,則使用CoerceValue回調來確保它保持在適當的范圍內。

  3. DependencyObjects在用戶代碼中已經失寵,而在很大程度上被WPF開發中的Model-View-ViewModel模式取代。 你仍然會發現DependencyObjects在自定義控件開發中。 DependencyProperties在用戶代碼中很常見,通常采用附加屬性的形式。

依賴項屬性本身是靜態的,因為您將屬性分配給對象類型。 它將屬性標識為一個整體,並不僅僅像CLR屬性那樣捕獲值。

正如您在(非靜態)CLR屬性中看到的那樣,存儲功能僅由SetValueGetValue處理。 您可以將依賴項屬性值想象為一個大字典,您只需將一些任意內容放入其中。 字典的關鍵是依賴屬性。

強制回調用於將值強制為某種格式。 在您的情況下,它將確保該字符串只有8個字符長。 大多數情況下,您不需要這樣的回調。 您甚至不需要經常更改屬性的屬性。 最常見的情況是可綁定屬性,只需使用標准元數據定義依賴屬性即可。

你的課程的目的是作為一個例子我猜。 如果您沒有特定的用例,我建議您甚至不要查看依賴項對象。 實際上很少將子類型DependencyObject本身。 通常,您有一個框架元素或組件,您可以繼承並向其添加自定義行為。 然后,只要您需要XAML等的可綁定屬性,就需要依賴屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM