【问题标题】:Easier way to create a DataContext than implementing INotifyPropertyChanged?创建 DataContext 比实现 INotifyPropertyChanged 更简单的方法?
【发布时间】:2013-09-16 06:11:44
【问题描述】:

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

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

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

所以我很好奇,有没有其他方法可以创建 DataContext,例如,只需从某个类派生就可以了?

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

一些第 3 方框架?

【问题讨论】:

    标签: wpf mvvm binding datacontext


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我已经成功地使用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,并最大限度地减少代码重复。

      【讨论】:

      • 感谢您提及这两个框架。经过一番研究,我决定使用Fody/PropertyChanged,它现在正在工作。
      【解决方案3】:

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

      【讨论】:

      • 看起来很诱人。您知道这种方法如何影响性能吗?乍一看,由于开发人员对它的控制较少,它可能会产生过多的“PropertyChanged”事件。
      • Postsharp 在编译时注入代码,因此唯一的性能开销是调用事件处理程序。如果您有一个视图模型,那么您的大多数属性都有属性更改事件。确实,您对何时引发它的控制较少,但您可能会添加其他属性,因此它仅在值不同时引发事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多