何时使用依赖属性

Jie*_*eng 14 c# wpf dependency-properties

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

现在我做的是

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

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

Ste*_*rex 21

你应该只DependencyProperty在你希望能够通过XAML 将值绑定到某个东西时使用,例如

<local:MyObject MyDependencyProperty="{Binding ...}" />
Run Code Online (Sandbox Code Playgroud)

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

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

<local:MyObject MyRegularProperty="Some Value" />
Run Code Online (Sandbox Code Playgroud)

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

<TextBlock Text="{Binding MyViewModelProperty}" />
Run Code Online (Sandbox Code Playgroud)

那你就不需要用了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
}
Run Code Online (Sandbox Code Playgroud)

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

<TextBlock Text="{Binding Color.Hue}" />
Run Code Online (Sandbox Code Playgroud)

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

  • 默认值对WPF的性能有一个非常重要的影响.它为每个对象节省了几百个字节,如果你的可视树包含几千个对象,那就是几百KB.整体内存的一小部分,但足以对高效的CPU缓存使用(尤其是布局期间)产生巨大影响.但是,它可能与任何非UI对象无关,并且可能对自定义UI元素没有很大帮助,因为您很可能会设置您定义的任何cusom属性.所以我同意......我只是想说明DP有多种用途. (4认同)

Pie*_*kel 15

一般规则是:

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

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

有例外,但它们很少见.