Silverlight 对DependencyObject和DependencyProperty的依赖

Silverlight 对DependencyObject和DependencyProperty的依赖,silverlight,xaml,Silverlight,Xaml,我正在构建一个Silverlight应用程序,我上次的一个警告是,如果您需要以Silverlight/WPF的方式正确地完成任何事情,您需要将对象建模为DependencyObject并使用DependencyProperty 我发现这个模型相当麻烦,在我使用的类中有一半需要静态字段和初始值设定项,所以使用好的旧事件驱动(观察者模式?)代替DependencyObject是个好主意吗 我的目标是尽量减少代码膨胀和锅炉板(我讨厌它们),我真的很想知道是否有人在Silverlight/WPF方面有任

我正在构建一个Silverlight应用程序,我上次的一个警告是,如果您需要以Silverlight/WPF的方式正确地完成任何事情,您需要将对象建模为DependencyObject并使用DependencyProperty

我发现这个模型相当麻烦,在我使用的类中有一半需要静态字段和初始值设定项,所以使用好的旧事件驱动(观察者模式?)代替DependencyObject是个好主意吗

我的目标是尽量减少代码膨胀和锅炉板(我讨厌它们),我真的很想知道是否有人在Silverlight/WPF方面有任何技巧/技巧可以将DependencyObject和DependencyProperty的使用降到最低


这是个好主意吗?

这实际上取决于您所指的对象。如果要将对象放在XAML树中,最好使用DependencyProperties(从而继承DependencyObject-所有UIElements都这样做)来实现DependencyProperties提供的所有好处(可设置动画、绑定、可选的自动子继承等)。如果你还没有读过,我强烈建议你读一下


如果对象是一个数据实体(即,将其值绑定到XAML树中的某个对象),则无需从DependencyObject继承。如果对象上的属性是读写的,您可能希望实现,这将允许绑定在值更改时自动更新。

实际上,在Silverlight中,您不能继承DependencyObjects,因此您应该(并且必须)实现INotifyPropertyChanged

实现INotifyPropertyChanged比DependencyObjects(我将简化此操作以使其更容易)和使用DependencyProperties(DPs)有许多优点:

  • 这是更轻的
  • 允许您更自由地建模对象
  • 可以很容易地序列化
  • 您可以在需要时引发事件,这在某些情况下非常有用,例如,当您希望仅在一个UI操作中捆绑多个更改时,或者当您需要在数据未更改的情况下引发事件时(强制重画…)
另一方面,在WPF中继承DOs具有以下优点:

  • 更容易实现,特别是对于初学者
  • 您可以免费获得一个回调机制(几乎),允许您在属性值更改时收到通知
  • 您可以使用强制机制定义属性的最大值、最小值和当前值的规则
还有其他考虑因素,但这些是主要考虑因素

我认为普遍的共识是,DPs对于控件非常有用(即使在Silverlight中,您也可以使用自定义DPs实现CustomControl),但是对于数据对象,您更应该实现INotifyPropertyChanged

嗯,,
Laurent

我同意Richard的观点,这取决于类的用途,但值得注意的是,在Silverlight 2.0版本中,您似乎可以直接从DependencyObject继承,而不必从UIElement或UserControl继承。至少,我正在我的(SilverLight 2.0 RTW)应用程序中这样做

在大多数情况下,直接从DependencyObject派生并不典型。相反,您可以从特定控件、某个控件基类(ContentControl;control;ItemsControl)、FrameworkElement或仍然参与UI的非控件类(如Panel或Grid)派生。如果您正在定义希望依赖属性处于活动状态的业务或数据存储对象,或者如果您正在创建将拥有附加属性的服务支持类,则从DependencyObject派生可能是合适的