由 WPF 属性系统支持的属性称为依赖项属性,依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。 这些其他输入可以包括系统属性(如主题和用户首选项)、实时属性确定机制(如数据绑定和动画/演示图板)、重用模板(如资源和样式)或者通过与元素树中其他元素的父子关系来公开的值。 另外,可以通过实现依赖项属性来提供独立验证、默认值、监视其他属性的更改的回调以及可以基于可能的运行时信息来强制指定属性值的系统。 派生类还可以通过重写依赖项属性元数据(而不是重写现有属性的实际实现或者创建新属性)来更改现有属性的某些具体特征。

自定义依赖项属性格式:

 以下为在自定义控件中标准格式:

 1 /// <summary>
 2         /// TimeProperty依赖项属性,依赖属性都是"公开的","静态的","只读的",其命名方式是"属性名+Property",
 3         /// </summary>
 4         public static readonly DependencyProperty TimeProperty =
 5             DependencyProperty.Register("Time", typeof(DateTime), typeof(ClockUserCtrl),
 6             new FrameworkPropertyMetadata(DateTime.Now, new PropertyChangedCallback(TimePropertyChangedCallback)));
 7 
 8         /// <summary>
 9         /// 依赖项属性值发生改变时回调
10         /// </summary>
11         /// <param name="sender"></param>
12         /// <param name="arg"></param>
13         private static void TimePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs arg)
14         {
15             if (sender != null && sender is ClockUserCtrl)
16             {
17                 ClockUserCtrl clock = sender as ClockUserCtrl;
18                 clock.OnTimeUpdated((DateTime)arg.OldValue, (DateTime)arg.NewValue);
19             }
20         }
21 
22         /// <summary>
23         /// 将TimeProperty依赖项属性包装为Time普通属性
24         /// </summary>
25         [Description("获取或设置当前日期和时间")]
26         [Category("Common Properties")]
27         public DateTime Time
28         {
29             get
30             {
31                 return (DateTime)this.GetValue(TimeProperty);
32             }
33             set
34             {
35                 this.SetValue(TimeProperty, value);
36             }
37         }

以下为普通格式:

 1 public static readonly DependencyProperty SidesProperty;
 2 
 3     // 将SidesProperty依赖项属性包装为Time普通属性
 4         public int Sides
 5         {
 6             get { return (int)GetValue(SidesProperty); }
 7             set { SetValue(SidesProperty,value); }
 8         }
 9 
10     //静态构造方法中注册
11         static GridSplit()
12         {
13             FrameworkPropertyMetadata md = new FrameworkPropertyMetadata();
14             md.PropertyChangedCallback = OnSidesChanged;
15             SidesProperty = DependencyProperty.Register("Sides1", typeof(int), typeof(GridSplit),md);
16         }
17     
18     //依赖项属性值发生改变时回调
19         static void OnSidesChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
20         {
21             
22         }