依赖项属性的默认默认值是什么?

时间:2017-03-30 13:36:16

标签: wpf dependency-properties

通过将PropertyMetadata的默认值传递给Register函数,可以为WPF依赖属性赋予默认值:

 public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(double), typeof(MyControl),
        new PropertyMetadata(0.0));

如果没有指定默认值,依赖项属性的默认值是什么,通过不传递PropertyMetadata或使用没有指定默认值的PropertyMetadata构造函数?

This page

  

(对于属性注册未指定元数据的情况,将使用该类的默认值创建默认PropertyMetadata。)

但我还没有找到描述这些默认值的地方。

2 个答案:

答案 0 :(得分:1)

以下参考代码是DependencyPropertyPropertyMetadata未给出默认值时调用的内容。

在大多数情况下它使用标准default valuesnull用于引用类型,为值类型归零),但对于枚举,它使用第一个枚举器而不是值为0的枚举器(如果它们是不同的。)

referencesource.microsoft.com

private static object GetDefaultValue(string name, System.Type propertyType, System.Type ownerType)
{
     if (name == null)
          throw new ArgumentNullException("name");
      if (name.Length == 0)
          throw new ArgumentException(SR.GetString(SR.Error_EmptyArgument), "name");
      if (propertyType == null)
          throw new ArgumentNullException("propertyType");
      if (ownerType == null)
           throw new ArgumentNullException("ownerType");

     object defaultValue = null;
     if (propertyType.IsValueType)
     {
         try
         {
             if (propertyType.IsEnum)
             {
                 Array values = Enum.GetValues(propertyType);
                 if (values.Length > 0)
                     defaultValue = values.GetValue(0);
                 else
                     defaultValue = Activator.CreateInstance(propertyType);
             }
             else
                 defaultValue = Activator.CreateInstance(propertyType);
         }
         catch
         {
         }
     }
     return defaultValue;
 }

答案 1 :(得分:1)

  

如果未指定默认值,依赖项属性的默认值是什么,通过不传递PropertyMetadata或使用未指定默认值的PropertyMetadata构造函数?

默认值是依赖项属性类型的默认值,即对于double依赖项属性,它是0.0(或default(double))。

您可以通过创建类的实例并访问依赖项属性的CLR包装器的getter来轻松地自行确认:

MyControl ctrl = new MyControl();
var x = ctrl.MyProperty; // = 0