2

据我所知,创建DataContext类的常用方法有两种,一种是实现INotifyPropertyChanged,另一种是从DependencyObject派生。

很多人说实现 INotifyPropertyChanged 的​​第一种方法更简单,我同意。

但我并不完全同意,因为我认为即使实现 INotifyPropertyChanged 也不够简单而且非常乏味,因为我必须重写属性的每个 setter 函数并触发事件,它主要是复制和粘贴和修改东西,我非常不喜欢. 它不优雅。

所以我很好奇,有没有其他方法可以创建 DataContext,例如,只是从某个类派生,一切都完成了吗?

我知道如果 datacontext 是一个集合,有一个非常简单的方法可以做到,只需从 ObservableCollection<> 继承,我认为这是一个非常好的解决方案。但是其他类呢?

一些第三方框架?

4

3 回答 3

1

你可以使用像Postsharp这样的 AOP 框架,它允许你简单地将一个属性放到你的类中,并INotifyPropertyChanged为你生成所有的胶水代码。

于 2013-09-12T02:38:02.480 回答
1

我已经成功地使用PostSharp为我的所有 ViewModel 快速实现了 INotifyPropertyChanged。事实上,这确实是使用 Aspects 的典型示例,如(当前)首页所示;

[NotifyPropertyChanged]  
public class Person  
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public string FullName  
    {  
        get { return this.FirstName + " " + this.LastName; } 
    } 
} 

您会在该站点上找到大量信息来向您展示如何执行此操作。

另一种(免费)替代方案可能是使用像Caliburn Micro这样的 WPF/MVVM 框架,其中包括“基本”类型PropertyChangedBase,您可以从中继承 ViewModel,并最大限度地减少代码重复。

于 2013-09-12T02:38:38.140 回答
1

我一般不会推荐这个,但我会提到它以防你不知道:你实际上不需要实现依赖属性或 INotifyPropertyChanged 来使数据绑定工作。当绑定到不实现 INotifyPropertyChanged 的​​类所拥有的非依赖属性时,WPF 将自动通过PropertyDescriptor.AddValueChanged进行侦听。

不推荐的原因是 PropertyDescriptor 是全局的,所以它和监听目标之间的引用是永久的,导致内存泄漏。请参阅此页面:http: //support.microsoft.com/kb/938416

但是,如果您只是想快速启动并运行一个演示/测试应用程序,那么这非常有效。

于 2013-09-12T03:46:20.983 回答