依赖属性命名约定

必需完全遵循已有的依赖属性命名约定,例外情况除外。
依赖属性本身有一个基本名称(此示例中为“AquariumGraphic”),此名称用作 Register 的第一个参数。 此名称在每个注册类型内必须唯一。 通过基类型继承的依赖属性会被视为注册类型的已有部分;无法再次注册已继承属性的名称。 但是,即使不继承依赖属性,也有方法可将类添加为依赖属性的所有者;有关详细信息,请参阅依赖属性元素据
创建标识符字段时,按注册时的属性名称命名此字段,再加上后缀 Property。 此字段是依赖属性的标识符,之后会被用作在包装器中进行 SetValueGetValue 调用的输入,供任何其他代码通过你自己的代码、经过允许的外部代码、属性系统甚至可能通过 XAML 处理器来访问属性时使用。
备注
在类的主体中定义依赖属性是典型的实现,但也可以在类静态构造函数中定义依赖属性。 需要多行代码来初始化依赖属性时,此方法会很有用。

实现“包装器”

包装器实现应在 get 实现中调用 GetValue,并在 set 实现中调用 SetValue(为清楚起见,此处也显示了原始注册调用和字段)。
除特殊情况外,包装器实现仅应执行 GetValueSetValue 操作。 其原因请参阅 XAML 加载和依赖属性主题。
WPF 类上提供的所有现有公共依赖属性都使用这一简单的包装器实现模型;大多数情况下,依赖属性工作原理的复杂性本质上在于它是属性系统的行为,还是通过其他概念(例如强制转换或通过属性元数据进行的属性更改回调)实现的行为。

  1. public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  2. "AquariumGraphic",
  3. typeof(Uri),
  4. typeof(AquariumObject),
  5. new FrameworkPropertyMetadata(null,
  6. FrameworkPropertyMetadataOptions.AffectsRender,
  7. new PropertyChangedCallback(OnUriChanged)
  8. )
  9. );
  10. public Uri AquariumGraphic
  11. {
  12. get { return (Uri)GetValue(AquariumGraphicProperty); }
  13. set { SetValue(AquariumGraphicProperty, value); }
  14. }

同样,根据约定,包装器属性名称必须与注册属性的 Register 调用选择并指定的第一个参数相同。 如果属性不遵从此约定,尽管不一定会禁用所有可能的用法,但你会遇到几个比较突出的问题:

  • 样式和模板的某些方面不起作用。
  • 大多数工具和设计器必须依赖命名约定,才能正确序列化 XAML 或在每个属性级别提供设计器环境帮助。
  • 处理特性值时,WPF XAML 加载程序的当前实现会完全跳过包装器,并依赖于命名约定。 有关详细信息,请参阅 XAML 加载和依赖属性