如何使用继承DependencyObject的类?

Jam*_*ery 5 c# wpf

我从这里开始关注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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

几个问题:

  1. 为什么财产是静态的?我不完全理解它是否意味着在对象级别存储一个值.
  2. Coerce回调做了什么以及为什么包含它?
  3. 我班级的目的是什么,我会在哪里使用它?

use*_*116 8

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

  1. DependencyProperty 定义是静态的,因为DependencyObject的所有实例都共享定义.它们就像是一个每个对象属性更高的字典.这还允许各种框架功能无缝地工作,例如绑定或呈现更新.

  2. 当您需要将属性的更改链接在一起时,会发生DependencyProperty强制.例如,如果您有一个Slider控件,其值应该在最小值和最大值之间,则使用CoerceValue回调来确保它保持在适当的范围内.

  3. DependencyObjects在用户代码中已经失宠,而在很大程度上被WPF开发中的Model-View-ViewModel模式取代.你仍然会发现DependencyObjects在自定义控件开发中.DependencyProperties在用户代码中很常见,通常采用附加属性的形式.