我正在构建一个Silverlight应用程序,我上次提出的一个警告是,如果您需要以Silverlight / WPF方式完成任何操作,则需要将对象建模为DependecyObject并使用DependencyProperty(ies)
我发现这个模型相当繁琐,需要使用静态字段和初始化器,而不是我使用的类的一半,所以使用旧的事件驱动(观察者模式?)代替DependencyObject是一个好主意吗? / p>
我的目标是最大限度地减少代码膨胀和锅炉板(我讨厌它们),并且真的想知道是否有任何具有Silverlight / WPF经验的人有任何提示/技术可以将DependencyObject和DependencyProperty的使用保持在最低限度?< / p>
这是个好主意吗?
答案 0 :(得分:4)
实际上,在Silverlight中你不能继承DependencyObjects,因此你应该(并且必须)实现INotifyPropertyChanged。
实现INotifyPropertyChanged比DependencyObjects有很多优点(我将缩写此DO以使其更容易)并使用DependencyProperties(DPs):
另一方面,在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