Pro mvvm读书笔记mvvm中的VM
一、构建ViewModels
设计模式的其中一个目标就是抽象构造一个给出指定类型的对象或者实现指定类型的接口的过程。需要把类给客户端,让客户端去使用,但是要隐藏类是具体的实现细节。
1.1The Application
在View中有个一个App,实现Application这个文件可以用来管理ViewModels。
xaml:
<Application x:Class="MvvmWpfApp.App"   
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
xmlns:viewModel="clrnamespace:    
MvvmWpfApp.ViewModel;assembly=MvvmWpfApp.ViewModel"    
Startup="Application_Startup">    
<Application.Resources>    
<viewModel:ApplicationViewModel x:Key="applicationViewModel" />    
</Application.Resources>    
</Application>
cs:
public partial class App : Application   
{    
private ApplicationViewModel _appViewModel;    
private void Application_Startup(object sender, StartupEventArgs e)    
{    
_appViewModel = Resources["applicationViewModel"] as ApplicationViewModel;    
if(_appViewModel != null)    
{    
_appViewModel.Startup();    
}    
}    
}
1.2The Main Window
namespace MvvmWpfApp
{
//通过ApplicationViewModel来获取一个MainViewModel
//从而赋给MainWindow.DataContext;
public partial class App :Application
{
ApplicationViewModel _appViewModel;
private void Application_Startup(object sender, StartupEventArgs e)
{
_appViewModel = Resources["applicationViewModel"] as ApplicationViewModel;
if (_appViewModel != null)
{
_appViewModel.Startup();
MainViewModel mainViewModel = _appViewModel.CreateMainViewModel();
MainWindow mainWindow = new MainWindow();
mainWindow.DataContext = mainViewModel;
this.MainWindow = mainWindow;
this.MainWindow.Show();
}
}
}
}
1.3并发处理
dispatchobject把system.object实例绑定到dispatcher上,意味着只有dispatcher创造的线程可以访问这个对象。wpf通常有两个线程,一个用于呈 现,一个用于处理UI和程序的代码。后者不止一个职责,在点击按钮事件代码里面System.Threading.Thread.Sleep(10000),如果在移动UI,那么UI是不会动的。因为线程处于休眠状态了。处理UI移动的线程和程序代码用的是同一个线程。通常如果model或者是ViewModel接受到的不是UI线程的事件,会出现InvalidOperationExpcetion.
二、避免在viewmodel中出现调用view中的类。
当使用mvvm时,可能会有种情况是,当一个点击菜单按钮,要弹出另一个窗体,此时最好不要去直接new一个窗体而破坏mvvm的模式,可以使用接口:
public interface IFilePathProvider
{
string GetLoadPath();
string GetSavePath();
}
public MainWindowViewModel(IFilePathProvider filePathFinder)
{
_filePathFinder = filePathFinder;
}
private void Load()
{
string loadFilePath = _filePathFinder.GetLoadPath();
if (loadFilePath != null)
{
// The user has selected a file to open
}
}
private void Save()
{
string saveFilePath = _filePathFinder.GetSavePath();
if(saveFilePath != null)
{
// The user has selected a file to save
}
}
public class FilePathProvider : IFilePathProvider
{
public string GetLoadPath()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "XML files (*.xml)|*.xml";
string filePath = null;
bool? dialogResult = ofd.ShowDialog();
if(dialogResult.HasValue && dialogResult.Value)
{
filePath = ofd.FileName;
}
return filePath;
}
public string GetSavePath()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "XML files (*.xml)|*.xml";
string filePath = null;
bool? dialogResult = sfd.ShowDialog();
if (dialogResult.HasValue && dialogResult.Value)
{
filePath = sfd.FileName; }
return filePath;
}
}
Pro mvvm读书笔记mvvm中的VM的更多相关文章
- 《编写可维护的javascript》读书笔记(中)——编程实践
		
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
 - 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
		
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
 - 《大型网站系统与Java中间件》读书笔记 (中)
		
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...
 - pro mvvm 读书笔记
		
一.分离关注点 目的是确保每一个模块值有单一的,明确的目的,不需要去负责其他的功能.单一的目的也称为关注点. 1.1依赖 引用程序集对于依赖来说不是必须的.依赖关系可能也存在于一个代码单元要知道另一个 ...
 - 3D数学读书笔记——3D中的方位与角位移
		
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移 ...
 - [读书笔记]java中的volatile关键词
		
以下内容大多来自周志明的<深入理解Java虚拟机>. 当一个变量被volatile修饰后,它将具备两种特性: 1. 保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变 ...
 - [读书笔记]java中的类加载器
		
以下内容大多来自周志明的<深入理解Java虚拟机>. 类加载器是java的一项创新,也是java流行的重要原因之一,它最初是为了满足java applet的需求而开发出来. 什么是appl ...
 - Pro Git 读书笔记
		
一. 起步 1. 集中式版本控制缺点:中央服务器的单点故障. 分布式版本控制优点:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后 ...
 - 锋利的jQuery读书笔记---jQuery中Ajax--get、post等方法
		
load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现ajax的全部价值. 在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或 ...
 
随机推荐
- Oracle-client支持exp|imp|rman
			
官方精简版的驱动,不支持持exp/imp/rman,故需要安装oracle_client客户端. 实验环境: Centos6.5 x64 Oracle 11.2.0.4.0 Oracle_clie ...
 - Java BigDecimal进行精确计算
			
前言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...
 - docker登录没有配置https的harbor镜像仓库
			
已经搭建harbor 仓库 ,域名 172.16.1.99 出现问题: 客户端尝试登录 仓库 [root@localhost docker]# docker login 172.16.1.99:80 ...
 - html学习第一讲(内容html常规控件的的使用)
			
<html> <head> <title> 这是网页的标题</title> </head> <body> <h2>& ...
 - HDUOJ----4504 威威猫系列故事——篮球梦
			
威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
 - NYOJ-------三角形
			
Problem A 三角形 时间限制:1000 ms | 内存限制:65535 KB 描述 在数学中,如果知道了三个点的坐标,我们就可以判断这三个点能否组成一个三角形:如果可以组成三角形,那么 ...
 - windows安装tensorflow GPU
			
一.安装Anaconda Anaconda是Python发行包,包含了很多Python科学计算库.它是比直接安装Python更好的选择. 二.安装Tensorflow 如果安装了tensorflow, ...
 - jquerymobile 的特有 事件 和 方法 (转)
			
1.触摸屏事件—— Touch events tap Triggers after a quick, complete touch event. 本人实际测试效果:轻轻点击,效果和按普通按钮差不多. ...
 - Accounting_会计电算化工作指南
			
会计电算化工作指南 会计电算化实施的内容目标及原则 企业会计电算化的实施,也就是企业建立会计电算化的整个过程,是一项复杂的系统工程.在整个系统的实施过程中,包括会计电算化工作的规划,会计信息的建立与管 ...
 - 检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式
			
非常简单可以解决: 方法一,用editplus打开,再复制回VS 方法二:在VS中,点文件->高级保存选项,然后在行尾选项中选择windows(CR LF),重新编译,ok