WPF系列之一:基于并行任务和MVVM创建响应灵敏和数据驱动的UI
2014-04-30 17:54
447 查看
在利用WPF创建桌面应用程序的界面时,经常使用MVVM的设计模式,以减少UI层与逻辑层的代码耦合度。
在MVVM的设计中,最主要的方法和技术是UI中的控件利用Binding来和逻辑层(ViewModel)进行交互,其中控件的属性为依赖属性,而作为控件的DataContext的ViewModel则实现了INotifyPropertyChanged接口。
除了一般意义上的属性的数据的交互,还有一些基于命令的Banding来实现界面元素的操作与内部函数的解耦。
这样,界面上的数据和操作(包括控件的命令和事件属性,事件的解耦后面会有一篇文章说明,在这里)都可以和底层实现解耦了,这样就使得ViewModel层和UI层有了明显的界限,松耦合的实现对将来的功能扩展和单元测试会是非常大的便利。
此外,因为View层(控件层)与ViewModel层的解耦,使得原来利用控件的事件进行底层交互的操作(可以使用Dispatcher进行异步交互)全部移到ViewModel层中了。某些情形下,这种交互可能是非常费时间的,比如访问数据库或者进行密集型运算,此时就可以利用.net的并行库对Model层进行异步的调用,当Model层结束查询或者运算时将结果更新到ViewModel层,ViewModel层因为实现了INotifyPropertyChanged接口,使得UI层得到通知更新。体现了数据驱动界面的思想。
准备:下载 Prism ,利用其中的DelegateCommand 放到ViewModel层来做为View层控件的Command绑定目标。
下面给出实际的例子:
1.创建一个WPF程序:
2.从下载的Prism包中找到Bin文件夹下的Desktop目录,引用其中的Assembly Microsoft.Practices.Prism.dll到新建的工程
3.主窗口对应的xaml文件如下:
ModelSimulator
最主要的代码就是创建带返回值的异步任务与Model层进行交互,命令被调用时,界面会保持响应状态。而Model层交互完成之后更新ViewModel层的数据。
此模式称为Future模式(带返回值得异步调用)。
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。
/article/5796333.html
在MVVM的设计中,最主要的方法和技术是UI中的控件利用Binding来和逻辑层(ViewModel)进行交互,其中控件的属性为依赖属性,而作为控件的DataContext的ViewModel则实现了INotifyPropertyChanged接口。
除了一般意义上的属性的数据的交互,还有一些基于命令的Banding来实现界面元素的操作与内部函数的解耦。
这样,界面上的数据和操作(包括控件的命令和事件属性,事件的解耦后面会有一篇文章说明,在这里)都可以和底层实现解耦了,这样就使得ViewModel层和UI层有了明显的界限,松耦合的实现对将来的功能扩展和单元测试会是非常大的便利。
此外,因为View层(控件层)与ViewModel层的解耦,使得原来利用控件的事件进行底层交互的操作(可以使用Dispatcher进行异步交互)全部移到ViewModel层中了。某些情形下,这种交互可能是非常费时间的,比如访问数据库或者进行密集型运算,此时就可以利用.net的并行库对Model层进行异步的调用,当Model层结束查询或者运算时将结果更新到ViewModel层,ViewModel层因为实现了INotifyPropertyChanged接口,使得UI层得到通知更新。体现了数据驱动界面的思想。
准备:下载 Prism ,利用其中的DelegateCommand 放到ViewModel层来做为View层控件的Command绑定目标。
下面给出实际的例子:
1.创建一个WPF程序:
2.从下载的Prism包中找到Bin文件夹下的Desktop目录,引用其中的Assembly Microsoft.Practices.Prism.dll到新建的工程
3.主窗口对应的xaml文件如下:
public class ModelSimulator { public string SimulateLongTimeWork(int seconds) { string rtn = null; Random rnd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < 300; i++) { rtn = rtn + rnd.Next(-100, 1000); } Thread.Sleep(new TimeSpan(0,0,seconds)); return rtn; } public string SimulateLongTimeWorkWithParameter(string para, int seconds) { string rtn = para + Environment.NewLine; Random rnd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < 300; i++) { rtn = rtn + rnd.Next(-100, 1000); } Thread.Sleep(new TimeSpan(0, 0, seconds)); return rtn; } }
ModelSimulator
最主要的代码就是创建带返回值的异步任务与Model层进行交互,命令被调用时,界面会保持响应状态。而Model层交互完成之后更新ViewModel层的数据。
此模式称为Future模式(带返回值得异步调用)。
// create parallel task ,async Task<string> engineTask = Task.Factory.StartNew<string>(() => engine.SimulateLongTimeWorkWithParameter(para, 5)); //UI callback engineTask.ContinueWith(task => { this.DataStringFromEngine = task.Result; IsEngineFree = true; CalculatingStatus = "Complete!"; });
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。
/article/5796333.html
相关文章推荐
- C# 实践之 基于WPF的mvvm模型,使UI独立,逻辑可测
- 基于modern ui for wpf的在线公开课平台 之二 创建我的modern ui程序
- WPF 之 Binding 数据驱动UI (INotifyPropertyChanged 向客户端发送属性更改通知,ValidationRule 数据校验, IValueConverter数据转换 )
- 一、利用Visual Studio 2010创建第一个基于服务和数据驱动的Silverlight应用程序
- Mvvm Light Toolkit for wpf/silverlight系列之数据绑定
- 【Web API系列教程】3.7 — 实战:处理数据(创建UI视图)
- 【转】Mvvm Light Toolkit for wpf/silverlight系列之数据绑定
- WPF 之 Binding 数据驱动UI—实战
- WPF研究之道——数据驱动UI
- WPF数据验证(4)——响应与获取验证错误
- mvvm结构中数据的关联----wpf
- Oracle Golden Gate 系列十二 -- GG 数据初始化装载二 基于SCN 的初始化 说明 与 示例
- wpf 根据DataTable在后台自动创建DataGrid,而且可以对数据进行初步处理,显示差异
- 基于MapReduce的非平衡大数据集分类任务总结
- sqlite 数据编辑系统 0.7beta (持续更新) wpf+mvvm
- Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法
- Windows CE驱动N枪拍案惊奇系列 之 基于Wince5.0的DM9000A的驱动分析和移植步骤
- WPF编游戏系列 之五 数据绑定
- WPF MVVM DataGird 数据分页
- Django系列——创建响应