依赖于DependencyObject和DependencyProperty

3
我正在构建一个Silverlight应用程序,我上次遇到的一个问题是,如果您想在Silverlight / WPF中正确完成任何工作,您需要将对象建模为DependecyObject并使用DependencyProperty(ies)。
我发现这种模型相当繁琐,需要在我使用的一半类中使用静态字段和初始化器,因此是否可以使用传统的事件驱动(观察者模式?)代替DependencyObject?
我旨在最小化代码膨胀和样板文件(我讨厌它们),真的很想知道有没有经验丰富的Silverlight / WPF用户有关于如何将DependencyObject和DependencyProperty的使用保持最少的技巧/技术?
这是一个好主意吗?
3个回答

4
实际上,在Silverlight中,您不能继承DependencyObjects,因此您应该(并且必须)实现INotifyPropertyChanged。
与使用DependencyProperties(DPs)相比,实现INotifyPropertyChanged有许多优点:
- 更轻量级 - 允许您更自由地对对象进行建模 - 可以轻松序列化 - 您可以在需要时引发事件,在某些情况下非常有用,例如当您想要将多个更改捆绑在一个UI操作中时,或者当您需要引发事件即使数据没有更改(强制重新绘制...)
另一方面,在WPF中继承DO具有以下优点:
- 对于初学者来说更容易实现。 - 您可以免费获得回调机制,使您在属性值更改时得到通知 - 您可以获得强制机制,允许您定义属性的最大值、最小值和当前值规则。
还有其他考虑因素,但这些是主要的考虑因素。
我认为普遍共识是,DP非常适合控件(甚至可以在Silverlight中实现带有自定义DP的CustomControl),但对于数据对象,您应该实现INotifyPropertyChanged。
希望对您有所帮助, Laurent

3

这取决于你所指的对象。如果该对象旨在位于XAML树中,则最好使用DependencyProperties(因此继承自DependencyObject - 所有UIElement都是如此),以允许DependencyProperties提供的所有好处(可动画化,绑定,可选自动子级继承等)。如果你还没有阅读过MSDN关于DependencyProperties的概述,我强烈建议你阅读。

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


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派生可能是合适的选择,或者如果您正在创建一个将拥有附加属性的服务支持类,则从DependencyObject派生可能是合适的选择。

希望对你有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接