3

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

我发现这个模型相当麻烦,在我使用的一半类中需要静态字段和初始化程序,那么使用古老的事件驱动(观察者模式?)代替 DependencyObject 是个好主意吗?

我的目标是尽量减少代码膨胀和样板(我讨厌它们),并且真的很想知道是否有任何具有 Silverlight/WPF 经验的人有任何技巧/技术可以将 DependencyObject 和 DependencyProperty 的使用保持在最低限度?

这是一个好主意吗?

4

3 回答 3

4

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

实现 INotifyPropertyChanged 与 DependencyObjects(我将缩写此 DO 以使其更容易)和使用 DependencyProperties (DPs) 相比具有许多优点:

  • 这个比较轻
  • 让您在建模对象时更加自由
  • 可以轻松序列化
  • 您可以在需要时引发事件,这在某些情况下可能很有用,例如,当您希望仅在一个 UI 操作中捆绑多个更改时,或者当您需要在数据没有更改的情况下引发事件时(以强制重绘...)

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

  • 更容易实施,尤其是对于初学者。
  • 您(几乎)免费获得回调机制,允许您在属性值更改时收到通知
  • 您将获得一个强制机制,允许您为属性的最大值、最小值和现值定义规则。

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

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

HTH,洛朗

于 2008-10-01T13:13:27.863 回答
3

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

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

于 2008-10-01T08:58:36.790 回答
1

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

MSDN 上的 System.Windows.DependencyObject

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

高温高压

于 2008-11-24T21:50:51.420 回答