WPF视图绑定的Model类的优雅实现


实现方法参考:

http://www.cnblogs.com/024hi/archive/2009/05/17/Let_Implementation_Of_INotifyPropertChanged_More_Graceful.html


这里面出现了三个值得注意的地方:1、强类型 2、扩展方法 3、Model类的实现。下面一个一个说。


1、强类型

一直说C#是强类型语言,通俗地讲,便是指C#中的“变量”在开发时的类型便是明确的:String便是String,Int32就是Int32,毫无争议。强类型的好处有很多,张嘴便可随意举上几例:

  • 能够享受代码提示功能
  • 能够获得重构工具的支持
  • 能够在编译期发现更多错误
  • ……

不过C#也不是“绝对”的强类型语言,因为它也有弱类型,那就是Object。我们知道Object是所有类型的最终基类,任何类型的对象都可以使用Object来引用。可是一旦转化成Object的变量之后,代码提示便消失了;即使我们“明确”对象的确切类型,也必须通过Cast才能使用——更何况它形成了一种被“滥用”或“误用”的机会。例如一段错误代码可能会传入一个不符合约定类型的对象,那么就会造成错误。更严重的是,这样的错误可能只要在“运行时”才能被发现,编译器对此无能为力。

总是使用强类型的视图,并且所有数据都从Model中获取

这是针对ASP.NET MVC 中的每种视图(View,Partial,Layout)都可以选择弱类型和强类型两种“基类”,两者的区别便是Model的类型来说的。但在WPF中,原理是一样的。这么做可能会在一定程度上增加了代码量,因为我们需要为每个视图建立一个Model,不过我认为这是值得的。在强类型的视图中,VS中能够对Model的各种成员做出丰富的代码提示,我们便可以快速地输入代码,并确保不会出现“拼写”之类的低级错误。


用来Binding的Model,如果不用强类型,则必须使用字符串作为参数调用更新,而字符串是常量,读写易出错,查错难,编译期很难发现问题。

因此,可以使用Lambda Expression这个强类型的表示方法来“告诉”NotifyPropertyChanged方法究竟该生成导向至哪个属性方法的链接。

参考:http://www.cnblogs.com/JeffreyZhao/archive/2009/02/27/mvc-use-strong-type-everywhere.html

2、扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。  扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

得到两点有用信息1 不用修改原始类型,不用创建新的派生类2 扩展方法是静态的

类似于python里的装饰器啊。(不一定对)

理解能力还是需要提高啊。下面四点参考 http://kb.cnblogs.com/page/42577/  (一个非常不错的系列)

扩展方法:

1 方法所在的类必须是静态的

2 方法也必须是静态的

3 方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。

4 在第一个参数前面还需要有一个this关键字。


参考:https://msdn.microsoft.com/zh-cn/library/bb383977.aspx


3、Model类的实现

Model类的实现只有一个问题一直困扰我,那就是声明的public event PropertyChangedEventHandler PropertyChanged;

是在什么时候绑定了方法?绑定的应该是对应控件的set方法。并且,ModelBase中也有PropertyChanged!=null的判断。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值