MVVM设计模式之精髓简化
2012-07-19 23:22
190 查看
MVVM 精要
![](http://pic002.cnblogs.com/images/2012/319735/2012071923203122.png)
1 Model :对现实对象的抽象。基本概括为都有哪些属性 。
2 ViewModel:是美一个界面的xaml的 数据通讯类。 View是从ViewModel类那找对应Binding的数据。
ViewModel的基本命名规则就是 View界面的名称加ViewModel后缀(MainWindowViewModel),ViewModel
中要暴露出所有View页面所需求的属性Binding以及操作CommandBinding。ViewModel中要实现所有页面操
作CommandBinding的动作方法。为了使Binding生效,所有ViewModel类都应该实现
INotifyPropertyChanged接口,通常的做法是自定义一个ViewModel基类来继承该接口,以后所有的
ViewModel类都继承这个自定义基类,从而达到通知Binding属性改变的目的。
大部分程序员都喜欢优雅一点的代码风,代码中尽可能的少出现硬编码("propertyName")这类。
所以相对优雅的办法应该是这样实现:
如此在ViewModel中暴露属性的时候就可以写成这样:
其中 使用this.RaisePropertyChanged(p => p.Input1); 来替换硬编码方式的 this.RaisePropertyChanged("Input1"); 因为敲这种硬编码灰常容易敲错...
当然还有一种解决错误办法的就是使用自定义 snippet ,用代码段实现,额跑题了。
3 View 也就是页面。View是从ViewModel暴露出的属性来取值。使用Binding,从而达到解耦的目的。
主要就是先把Model抽象出来。然后根据View界面操作需要来丰富ViewModel。MVVM的中心思想主要就这些,可为什么还是觉得自己应用到实践中总是那么费劲呢?
MvvmLight 、SimpleMvvm 这些还不想去琢磨,我想先自己完全手敲出来...
接下来该怎么学习呐?跪求高人点拨。
![](http://pic002.cnblogs.com/images/2012/319735/2012071923203122.png)
1 Model :对现实对象的抽象。基本概括为都有哪些属性 。
2 ViewModel:是美一个界面的xaml的 数据通讯类。 View是从ViewModel类那找对应Binding的数据。
ViewModel的基本命名规则就是 View界面的名称加ViewModel后缀(MainWindowViewModel),ViewModel
中要暴露出所有View页面所需求的属性Binding以及操作CommandBinding。ViewModel中要实现所有页面操
作CommandBinding的动作方法。为了使Binding生效,所有ViewModel类都应该实现
INotifyPropertyChanged接口,通常的做法是自定义一个ViewModel基类来继承该接口,以后所有的
ViewModel类都继承这个自定义基类,从而达到通知Binding属性改变的目的。
/// <summary> /// 实现INotifyPropertyChanged 接口的 具有属性改变通知的 ViewModel 基类。 /// </summary> public class NotificationObject:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; /// <summary> /// 对PropertyChangedEventHandler 的一个封装。 /// </summary> /// <param name="propertyName"></param> public void RaisePropertyChanged(string propertyName) { if (this.PropertyChanged!=null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
大部分程序员都喜欢优雅一点的代码风,代码中尽可能的少出现硬编码("propertyName")这类。
所以相对优雅的办法应该是这样实现:
/// <summary> /// NotificationObject 优雅扩展 ^_^ /// </summary> public static class NotificationObjectEx { public static void RaisePropertyChanged<T, TProperty>(this T notificationObject, Expression<Func<T, TProperty>> expression) where T : NotificationObject { var memberExpression = expression.Body as MemberExpression; if (memberExpression != null) { string propertyName = memberExpression.Member.Name; notificationObject.RaisePropertyChanged(propertyName); } else { throw new NotImplementedException(); } } }
如此在ViewModel中暴露属性的时候就可以写成这样:
private double input1; public double Input1 { get { return input1; } set { if (input1 == value) return; input1 = value; this.RaisePropertyChanged(p => p.Input1); } }
其中 使用this.RaisePropertyChanged(p => p.Input1); 来替换硬编码方式的 this.RaisePropertyChanged("Input1"); 因为敲这种硬编码灰常容易敲错...
当然还有一种解决错误办法的就是使用自定义 snippet ,用代码段实现,额跑题了。
3 View 也就是页面。View是从ViewModel暴露出的属性来取值。使用Binding,从而达到解耦的目的。
主要就是先把Model抽象出来。然后根据View界面操作需要来丰富ViewModel。MVVM的中心思想主要就这些,可为什么还是觉得自己应用到实践中总是那么费劲呢?
MvvmLight 、SimpleMvvm 这些还不想去琢磨,我想先自己完全手敲出来...
接下来该怎么学习呐?跪求高人点拨。
相关文章推荐
- js架构设计模式——从angularJS看MVVM
- iOS MVC设计模式与MVVM设计模式简介 —— HERO博客
- 如何利用Interception简化MVVM中的Model和ViewModel的设计
- Android DataBinding库(MVVM设计模式)
- 设计模式-MVC,MVP 和 MVVM
- Android DataBinding库(MVVM设计模式)
- iOS中的MVVM设计模式
- android设计模式(MVC MVP MVVM)
- 我是如何学习设计模式的一:.NET C# 委托定天下,学好委托事件,设计模式精髓可以理解三分之一,怎么说也是三分天下之势了
- iOS 基于MVVM设计模式的微信朋友圈开发
- MVVM设计模式相关--Silverlight商业应用程序开发学习笔记(12)
- 设计模式的精髓
- SilverLight中MVVM设计模式
- 在UWP中实现自己的MVVM设计模式
- MVVM 设计模式中的控件加载、卸载
- 关于 MVVMLight 设计模式系列
- iOS——MVVM设计模式
- MVVM设计模式
- 浅谈MVP与Model-View-ViewModel(MVVM)设计模式
- MVVM设计模式