2010-11-05 42 views
14

我有时会认为我可能会不必要地使用依赖属性。我什么时候需要使用它?当我有一个属性依赖于其他属性?说我有一个Color属性,我希望它依赖于属性色调,饱和度,亮度我使用依赖项属性?或者我使用什么?当属性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行?

+1

我认为这在代码方面没有不合理的开销,它肯定比添加DependencyProperty更加轻量级 – 2010-11-05 10:15:40

+0

如果你打算使用hsl-color路由,我会这样做,所以我不要不需要经常计算,例如,随时存储H,S和L,只在需要同步时才进行转换,这会极大地提高你的速度。 – 2012-06-11 14:45:46

回答

21

如果您希望能够通过XAML将值绑定到某个值,您应该只使用DependencyProperty

<local:MyObject MyDependencyProperty="{Binding ...}" /> 

更新:如下面伊恩提到,依赖属性还要求,如果你希望能够到动画的属性,或将其通过样式

如果您不需要以这种方式工作那么这是没有必要的。例如如果你只是希望能够通过XAML将值设置为常数(如下),这将工作,而无需使用DependencyProperty

<local:MyObject MyRegularProperty="Some Value" /> 

同样,如果要绑定一个属性的值上(举例来说)您的视图模型:

<TextBlock Text="{Binding MyViewModelProperty}" /> 

那么你并不需要使用DependencyProperty。如果您执行INotifyPropertyChanged,那么Text在属性更改时仍会更新。

编辑:在重新阅读你的问题,我不知道是否你的情况将您是否使用DependencyProperty的影响 - 如果我正确地读它,所有你想要做的是当这些属性中的任何一个发生更改时,都会在UI上更新许多属性,对吗?

我不认为你目前的执行方式有什么问题(例如,在每个引导者中提高了很多PropertyChanged事件),但是如果你不喜欢,那么你可以试试暴露相关的子属性绑定到单个属性都计算:

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

然后对您的视图模型一个Color属性,提高了PropertyChanged事件,并通过查看绑定到:

<TextBlock Text="{Binding Color.Hue}" /> 

正如我所说的,我不会说这是对你已经有的改善。

+0

绑定不是用例。如果实现该属性的对象是一个UI元素(并且某些人在非UI对象上实现了DP),DP系统将启用各种其他功能,包括动画,样式和(仅WPF - Silverlight不具有这些)触发器。另外,如果属性经常保留其默认值,则DP很有用,因为每个实例仅为已设置的DP使用空间。 – 2010-11-05 09:37:10

+0

@ Ian Griffiths,动画和造型上的亮点 - 回答更新。我认为你对默认值的评论是有效的,但考虑到通过一个普通属性实现和使用一个依赖属性的开销(特别是如果你还没有处理'DependencyObject'的话),我通常不会去那条路线。 – 2010-11-05 09:49:37

+4

默认值对WPF的性能有不小的影响。它可以节省每个对象几百个字节,并且如果您的可视化树包含几千个对象,那就是几百KB。只占整个内存的一小部分,但足以对高效的CPU高速缓存使用产生巨大影响(尤其是在布局过程中)。但是,对于任何非UI对象而言,这可能是无关紧要的,并且对于自定义UI元素可能不是很有帮助,因为您很可能会设置您定义的任何cusom属性。所以我同意......我只是想说明DP有多种用途。 – 2010-11-05 10:11:52

15

的一般规则是:

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

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

也有例外,但它们很少见。

0

请记住,依赖属性尽管它们允许绑定作为源或目标,但它们也是线程敏感的,并且在序列化时必须使用代理,序列化作为DependencyObject不可序列化。

哦,并且等于和GetHashCode密封:(

2

依赖属性的另一个用途是用导航杂志上。与在元数据Juornal标志页面定制依赖属性被包括在状态保存WPF