【问题标题】:What is the default default value of a dependency property?依赖属性的默认默认值是多少?
【发布时间】:2017-03-30 13:36:16
【问题描述】:

可以通过将具有默认值的 PropertyMetadata 传递给 Register 函数来为 WPF 依赖项属性指定默认值:

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

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

This page

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

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

【问题讨论】:

  • a default PropertyMetadata is created with default values for that class 有点回答问题

标签: wpf dependency-properties


【解决方案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;
 }

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这是否记录在任何地方?
    • 这里记录了所有原始类型的默认值:msdn.microsoft.com/sv-se/library/83fhsxwc.aspx。属性只是一种灵活的机制,用于读取、写入或计算私有支持字段的值。依赖属性和 WPF 在此之上提供了一组服务。但是支持字段仍然获得类型的默认值。还可以设置什么以及如何设置?
    • WPF 足够复杂,如果涉及其他内容,我不会感到惊讶。根据 Fre 博士在回答中引用的代码,它实际上确实做了一些不同的事情,至少对于枚举而言。
    • 当然,依赖属性与 CLR 属性不同,但默认值是相同的,除非您在注册依赖属性时更改它。它没有得到任何神奇或意外的默认值。
    • 好吧,我还没有检查过,但这应该被视为未记录的实现细节,可能会在未来的版本中更改。您不应以任何方式依赖或依赖它。如果你想为依赖属性分配一个默认值,你应该在注册属性时这样做。
    猜你喜欢
    • 2011-08-19
    • 2011-12-01
    • 2015-06-12
    • 2022-11-11
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多