何时使用依赖项属性

我有时认为我可能不必要地使用依赖属性。 我什么时候需要使用它? 当我有一个依赖于其他属性的属性? 假设我有一个Color属性,我希望它依赖于属性Hue,Saturation,Luminosity我是否使用依赖属性? 或者我用什么? 当属性Hue,Saturation,Luminosity改变时,我控制绑定到Color以更新。

现在我做的是

 public byte Hue { get { return _hue; } set { if (_hue == value) return; _hue = value; NotifyPropertyChanged("Hue"); NotifyPropertyChanged("Color"); // to update controls bound to color } } 

但我认为这不是正确的做事方式? 如果我有更多影响颜色的属性,我将在所有这些属性中增加1行?

当您希望能够通过XAML将值绑定到某些内容时,您应该只使用DependencyProperty ,例如

  

更新:如下面的Ian所述,如果您希望能够为您的属性设置动画或通过样式设置它,还需要依赖项属性

如果您不需要以这种方式工作,那么就没有必要了。 例如,如果您只想通过XAML将值设置为常量(如下所示),则无需使用DependencyProperty

  

同样,如果要绑定 (例如)视图模型上的属性值:

  

那么你不需要使用DependencyProperty 。 如果您实现了INotifyPropertyChanged那么当属性更改时, Text仍将更新。

编辑:在重新阅读你的问题时,我不确定你的情况是否会受到你是否使用DependencyProperty – 如果我正确地阅读它,你想要做的就是导致许多属性当这些属性中的任何一个发生变化时,在UI上进行更新,对吧?

我认为你现在的实施方式没有任何问题(即在每个setter中引发很多PropertyChanged事件),但是如果你不热衷于那么你可以试着拥有一个暴露的单一属性绑定到的相关子属性全部计算:

 class ColorWrapper { public Color Color { get; set; } public byte Hue { get { return this.Color.Hue; } //or however this is calculated } 

然后在ViewModel上有一个Color属性,它会引发PropertyChanged事件并通过View绑定到该事件:

  

正如我所说,我不会说这对你已经拥有的东西特别有所改善。

一般规则是:

  • 对于XAML控件,请使用依赖项属性;

  • 对于数据(您在界面中绑定),请使用INotifyPropertyChanged

有例外,但它们很少见。

依赖属性的另一个用途是导航日志。 在元数据中具有Juornal标志的页面上的自定义依赖项属性包含在WPF为页面保存的状态中。

请记住,依赖属性虽然允许Binding作为源或目标,但也是线程敏感的,并且在序列化时您必须使用代理,序列化因为DependencyObject不可序列化。

哦,Equals和GetHashCode是密封的:(