6

我从这里关注了一个关于依赖对象的教程: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. 我上课的目的是什么,我会在哪里使用它?
4

2 回答 2

8

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

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

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

  3. DependencyObjects 在用户代码中已经失宠,取而代之的是在 WPF 开发中很大程度上被模型-视图-视图模型模式所取代。您仍然可以在自定义控件开发中找到 DependencyObjects。DependencyProperties在用户代码中很常见,通常以Attached Properties的形式出现。

于 2013-03-14T00:33:55.123 回答
3

依赖属性本身是静态的,因为您将属性分配给对象类型。它将属性标识为一个整体,而不仅仅是像 CLR 属性那样捕获值。

正如您在(非静态)CLR 属性中所见,存储功能由SetValue单独GetValue处理。您可以将依赖属性值想象成一个大字典,您只需将一些任意内容放入其中。字典的键是依赖属性。

强制回调用于强制将值转换为某种格式。在您的情况下,它将确保字符串只有 8 个字符长。大多数时候,您不需要这样的回调。您甚至不需要经常更改属性的回调。最常见的情况是可绑定属性,只需使用标准元数据定义依赖属性就足够了。

我猜你上课的目的是作为一个例子。如果您没有特定的用例,我不建议您甚至查看依赖对象。实际上,您很少对DependencyObject自己进行子类型化。通常您有一个框架元素或组件,您可以继承并向其添加自定义行为。然后,每当您需要 XAML 等的可绑定属性时,就需要依赖属性。

于 2013-03-14T00:38:54.050 回答