`

[Silverlight入门系列]使用MVVM模式(4):Prism的NotificationObject自动实现INotifyPropertyChanged接

    博客分类:
  • MVVM
阅读更多

上一篇写了Model的INotifyPropertyChanged接口实现,在Prism中有一个NotificationObject自动实现了这个接口,位于Microsoft.Practices.Prism.ViewModel命名空间下。也就是说,Prism推荐ViewModel继承这个NotificationObject类来自动实现INotifyPropertyChanged接口。看看NotificationObject都有啥:

1 public abstract class NotificationObject : INotifyPropertyChanged 2 { 3 protected NotificationObject(); 4 5 protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression); 6 protected void RaisePropertyChanged(params string[] propertyNames); 7 protected virtual void RaisePropertyChanged(string propertyName); 8 }

提供了几个很方面的接口,调用更方便了,例如:

1 public string ModelName 2 { 3 get { return _ModelName; } 4 set 5 { 6 _ModelName = value; 7 8 RaisePropertyChanged("ModelName"); 9 10 } 11 }

第二个RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression);是一个表达式,编译为一个Func委托,返回一个T类型。

例如可以这样用:

1 this.RaisePropertyChanged(() => this.MyDataSummary);

ViewModel的INotifyPropertyChanged接口和Model的INotifyPropertyChanged接口

ViewModel和Model它们二者都实现INotifyPropertyChanged接口并不矛盾。用途不一样。例如一个ViewModel可以包含多个其它的ViewModel,而它们有一个整体的HasChanged属性来标识是否有改变。这个时候这个整体的ViewModel的HasChanged属性就可以用整体的INotifyPropertyChanged,而局部的INotifyPropertyChanged实现了这个整体的INotifyPropertyChanged。看个例子:

1 using Microsoft.Practices.Prism.ViewModel; 2 3 public class MyViewModel3: NotificationObject 4 { 5 public MyModel MyModelData { get; set; } 6 public MyModel2 MyModelData2 { get; set; } 7 8 public bool HasChanges { get; set; } 9 public bool CanSave { get; set; } 10 11 public MyViewModel3(MyModel model, MyModel2 model2) 12 { 13 MyModelData = model; 14 MyModelData2 = model2; 15 16 model.PropertyChanged += this.OnPropertyChanged; 17 } 18 19 private void OnPropertyChanged(object sender, PropertyChangedEventArgs args) 20 { 21 if (args.PropertyName == "Name") 22 { 23 this.HasChanges = true; 24 this.RaisePropertyChanged(() => this.CanSave); 25 } 26 } 27 } 28 29 public class MyModel2 : INotifyPropertyChanged 30 { 31 public event PropertyChangedEventHandler PropertyChanged; 32 33 public int ModelID { get; set; } 34 35 private string _ModelName; 36 public string ModelName 37 { 38 get { return _ModelName; } 39 set 40 { 41 _ModelName = value; 42 43 if (PropertyChanged != null) 44 { 45 PropertyChanged(this, new PropertyChangedEventArgs("ModelName")); 46 } 47 } 48 } 49 } 50 51 public class MyModel : INotifyPropertyChanged 52 { 53 public event PropertyChangedEventHandler PropertyChanged; 54 55 public int ModelID { get; set; } 56 57 private string _ModelName; 58 public string ModelName 59 { 60 get { return _ModelName; } 61 set 62 { 63 _ModelName = value; 64 65 if (PropertyChanged != null) 66 { 67 PropertyChanged(this, new PropertyChangedEventArgs("ModelName")); 68 } 69 } 70 } 71 }

此外,Validation既可以放在Model里面也可以放在ViewModel里面,看你的规则是否简单,是否涉及业务逻辑,有的复杂的业务逻辑validation的需要调用后台service的建议放到ViewModel中去做。

分享到:
评论

相关推荐

    [SilverLight 入门知识]INotifyPropertyChanged 接口

    3. MVVM 模式:在 SilverLight 中,MVVM(Model-View-ViewModel)模式广泛使用,INotifyPropertyChanged 是实现 ViewModel 与 View 之间数据交互的关键。 4. 优化性能:通过 INotifyPropertyChanged,只在真正需要...

    基于Prism框架的MVVM设计模式的WPF实例代码

    **Prism框架与MVVM设计模式** 在软件开发领域,特别是Windows Presentation Foundation(WPF)应用开发中,Prism框架和MVVM(Model-View-ViewModel)设计模式是两个非常重要的概念。本实例代码旨在展示如何结合两者...

    wpf mvvm 的例子主要是对ICommand和INotifyPropertyChanged的使用

    具体到文件名`WPF_MVVMICommand`,这可能是一个演示或教程项目,展示了如何在WPF中使用MVVM模式实现命令功能,特别是`ICommand`的实现和`INotifyPropertyChanged`接口的应用。通过分析和学习这个项目,开发者可以更...

    如何创建更好的Silverlight程序系列课程(3):Silverlight & MVVM

    在实际开发过程中,我们可以使用诸如MVVM Light、Caliburn.Micro或Prism等框架来简化MVVM的实现。这些框架提供了便捷的工具和库,如依赖注入容器、事件中介、命令实现等,帮助开发者更快地构建符合MVVM原则的应用...

    silverlight MVVM模式示例

    在Silverlight中,有一些库如Caliburn.Micro、Prism和MVVM Light等,它们提供了对MVVM模式的良好支持,包括依赖注入、事件代理、路由和导航等功能,帮助开发者更方便地实现MVVM架构。 综上所述,"Silverlight MVVM...

    silverlight+MVVM+PRISM经典示例

    5. **命令(Command)**:MVVM模式中,ViewModel通过实现ICommand接口或使用DelegateCommand、RelayCommand等实现命令,使得视图可以响应用户操作,而无需直接操作视图元素。 6. **事件总线(EventAggregator)**:...

    MVVM-Prism入门小例子,很实在的

    Prism不仅简化了MVVM的实现,还提供了模块化、依赖注入、事件聚合、命令系统等一系列功能,有助于构建大型、复杂的企业级应用程序。 **入门步骤** 1. **创建项目**:首先,你需要创建一个基于WPF或UWP的新项目,并...

    实现mvvm模式 Silverlight

    在实际项目中,我们可能还需要使用一些辅助工具和框架,如MVVMLight、Caliburn.Micro或Prism,它们提供了额外的基础设施支持,如事件代理、导航服务和自动注入ViewModel等,以简化MVVM模式的实现。 总之,MVVM模式...

    Silverlight中使用MVVM

    在Silverlight中,实现命令的方式主要有两种:一是使用System.Windows.Input.ICommand接口,二是使用 Prism 库中的 DelegateCommand 或 RelayCommand 类。这些命令对象具有CanExecute和Execute方法,CanExecute用于...

    Prism MVVM应用 登陆后切换主窗体实现

     使用Prism7开发WPF程序,编码采用MVVM形式。当程序启动时,首先进入一个登陆界面,进行登陆认证,认证成功后转入程序布局主窗口。 设计思路  WPF程序框架搭建后,程序中存一个Shell.xaml,相当于表演者的唯一...

    使用Command机制实现的Silverlight4.0多层MVVM模式简单案例

    "使用Command机制实现的Silverlight4.0多层MVVM模式简单案例"是一个适合初学者学习的示例,它演示了如何在Silverlight中应用MVVM模式来构建一个分层的、可维护的UI。通过了解并实践这个案例,开发者可以掌握MVVM的...

    INotifyPropertyChanged接口在Silverlight中使用的例子

    INotifyPropertyChanged接口是.NET框架中一个非常重要的设计模式,它主要用于实现数据绑定的实时更新。在Silverlight中,这个接口的应用尤为关键,因为Silverlight的数据绑定机制依赖于它来感知对象属性的变化并自动...

    MVVM模式下的silverLight基于MySQL数据库的实例解析

    在本实例中,我们将展示如何使用 MVVM 模式开发一个基于 MySQL数据库的 SilverLight 应用程序,实现用户根据用户名的模糊查询。 MVVM 模式的优点 MVVM 模式解决了在 WPF/Silverlight 应用程序开发中产生的业务层和...

    WPF Prism MVVM弹窗及国际化小示例

    在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)环境中使用Prism库和MVVM(Model-View-ViewModel)设计模式实现增删改查、弹窗以及国际化功能。Prism是.NET Framework中用于构建模块化、可...

    基于Prism的MVVM简单实例

    在本文中,我们将深入探讨基于Prism的MVVM(Model-View-ViewModel)框架的简单应用实例,如何实现数据的添加、修改和删除,并通过数据绑定自动更新UI界面。MVVM模式是软件开发中一种流行的设计模式,尤其在WPF和UWP...

    Silverlight MVVM模式应用

    综上所述,"Silverlight MVVM模式应用"的资源集成了MVVM模式的各个关键组成部分,包括View的定义、ViewModel的实现、数据模型的处理以及与服务的交互,展示了如何在Silverlight中高效地构建可维护、可扩展的应用程序...

    WPF MVVM+Prism+MaterialDesign+Sqlite,实现永久性本地存储笔记本

    WPF实现持久化笔记本,MVVM模式,依赖注入

    Silverlight中使用MVVM.docx

    在Silverlight应用中,MVVM(Model-View-ViewModel)是一种设计模式,它提倡将业务逻辑、用户界面和数据模型分离,从而实现更清晰的代码结构和更好的可测试性。以下是对MVVM模式在Silverlight中的应用进行的详细说明...

Global site tag (gtag.js) - Google Analytics