• F# 与 WPF 之多语言实现MVVM(二)


    F#WPF 实现MVVM之二

    作者:墨梅

    时间:2012年7月23日

    上一篇中,初步介绍了:使用F#采用多语言方式,实现MVVM的WPF程序。在这篇中,我将继续这个主题,多语言方式实现MVVM:View采用C#+XAML实现(因为VS中对C#的具有很好的很优秀的支持,F#这方面还是很匮乏的),ViewModel层和Model层使用F#实现,据说可以使代码量减到原来的四分之一哦。

    这个示例主要是:计算一个员工的工资:

    一个人的工资= 工作时间(月) × 月工资 + 福利

    当工作时间(月)、月工资、福利中任意一个发生改变的时候,自动计算

    一个人的工资。当然,在这些元素改变时,计算工资之前,需要对这些元素进行验证,确保用户的输入是正确的,同时对错误的输入进行提示。

    最终的示例运行如下:

    image

    (注:其中RelayCommand已经实现,只是未加载上来,这个在上篇文章已经实现过)。

    Mode层实现:PersonModel

    这个类只含有工作时间,名字,月工资,福利这几个属性。因此采用隐式类的实现更好。并给月工资,福利,工作时间添加相应的单位。

    image

    ViewModel层:PersonViewModelPresonEditeViewModel

    这个类绑定到View层,要实现:INotifyPropertyChanged接口,当相应属性发生改变时同绑定的界面控件进行同步。这次采用类定义的显示语法,实现INotifyPropertyChanged接口时,需要先定义一个Event<_,_> 类型的字段:

    image

    然后实现该接口,并用属性[<CLIEvent>]属性进行标记:

    image

    由于需要对绑定的属性,进行数据验证,所以当然是选择让PersonViewModel类实现IDataErrorInfo接口。也有其他的数据验证的方法,如利用数据绑定异常来验证…..

    现在有一个问题是,什么时候对绑定到View层控件的属性,进行验证确保用户的输入是正确的。当然,可以在属性的set(value)函数中进行赋值之前进行验证,这时候就有一个问题,使得验证部分的功能散步在这些函数中。更好的实现方法是,将所有需要的验证实现为一个函数,进行统一的验证。当PropertyChanged事件触发的时候,便进行数据验证。怎么实现呢?就是添加对PropertyChanged事件的订阅,在这里处理数据验证。由于F#中对于接口的实现,相当于C#中显示接口实现。因此,必须转换为接口,才能调用PropertyChanged函数。

    为实现对这些员工的列表管理,所以实现PersonEditeViewModel类,这里有一个问题是:如何监视列表ListBox的SelectedItem改变。有两种解决办法,第一中,也是我之前常用的一种,在View层中,直接绑定到ListBox的SelectedItem 选项,这也是比较简单的一种。第二中办法是,使用ListCollectionView作为ListBox的数据上下文,从而可以在ViewModel层中,实现ListCollectionView 的SelectedChanged事件,间接得到ListBox的SelectedChanged事件。

    image

    image

    View层:

    这里没有什么特别的,只要看我附加的源码,看看就清楚明白了。只是这里在样式中使用DataTemplate,这里需要注意点。

    示例代码下载:

    PersonDemo.rar

  • 相关阅读:
    filter的用法
    刚下载好的 vscode 不能运行,一片黑 以及终端不能输入 解决办法
    JS获取光标在input 或 texterea 中下标位置
    JS 数组去重
    字符串操作函数:JSON.parse()、JSON.stringify()、toString 的区别,字符串转数组 str.split(','),数组转字符串String(),以及对象拼接合并Object.assign(),数组拼接合并concat()
    创建标准化工程目录脚本
    configParse模块
    json与api- 天气api 博客词频分析
    文件读写
    os模块、文件压缩 、匹配文件后缀名:fnmatch glob
  • 原文地址:https://www.cnblogs.com/xiwang/p/2604569.html
Copyright © 2020-2023  润新知