依赖于DependencyObject和DependencyProperty

时间:2008-10-01 07:15:05

标签: silverlight xaml

我正在构建一个Silverlight应用程序,我上次提出的一个警告是,如果您需要以Silverlight / WPF方式完成任何操作,则需要将对象建模为DependecyObject并使用DependencyProperty(ies)

我发现这个模型相当繁琐,需要使用静态字段和初始化器,而不是我使用的类的一半,所以使用旧的事件驱动(观察者模式?)代替DependencyObject是一个好主意吗? / p>

我的目标是最大限度地减少代码膨胀和锅炉板(我讨厌它们),并且真的想知道是否有任何具有Silverlight / WPF经验的人有任何提示/技术可以将DependencyObject和DependencyProperty的使用保持在最低限度?< / p>

这是个好主意吗?

3 个答案:

答案 0 :(得分:4)

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

实现INotifyPropertyChanged比DependencyObjects有很多优点(我将缩写此DO以使其更容易)并使用DependencyProperties(DPs):

  • 这是更轻量级的
  • 允许您更自由地建模对象
  • 可以轻松序列化
  • 您可以在需要时引发事件,这在某些情况下很有用,例如,当您只想在一个UI操作中捆绑多个更改时,或者即使数据不是这样也需要引发事件改变(强制重绘......)

另一方面,在WPF中继承DO具有以下优点:

  • 特别适合初学者使用。
  • 您可以免费获得一个回调机制(几乎),允许您在属性值更改时收到通知
  • 您可以使用强制机制来定义属性的最大值,最小值和现值的规则。

还有其他一些考虑因素,但这些是主要考虑因素。

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

HTH, 劳伦

答案 1 :(得分:3)

这实际上取决于您所指的对象。如果该对象打算放在XAML树中,最好使用DependencyProperties(并因此继承DependencyObject - 所有UIElements都这样做)以允许DependencyProperties提供的所有好处(可动画,绑定,可选的自动子继承等)。如果您还没有,我强烈建议您阅读MSDN overview on DependencyProperties

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

答案 2 :(得分:1)

我同意Richard的观点,这取决于你的课程的目的,但是作为一个注释,你似乎可以直接在Silverlight 2.0 Release中继承DependencyObject,而不必继承UIElement或UserControl。至少,我在我的(SilverLight 2.0 RTW)应用程序中这样做。

System.Windows.DependencyObject on MSDN

  

对于大多数情况,直接从DependencyObject派生 不典型 。相反,您可以从一个特定控件,一个控件基类(ContentControl; Control; ItemsControl),FrameworkElement,或者仍然参与UI的非控件类(如Panel或Grid)派生。如果要定义要在其中激活依赖项属性的业务或数据存储对象,或者如果要创建将具有附加属性的服务支持类,则可能适合从DependencyObject派生。

HTH