一、构建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的更多相关文章

  1. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  2. 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式

    断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...

  3. 《大型网站系统与Java中间件》读书笔记 (中)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...

  4. pro mvvm 读书笔记

    一.分离关注点 目的是确保每一个模块值有单一的,明确的目的,不需要去负责其他的功能.单一的目的也称为关注点. 1.1依赖 引用程序集对于依赖来说不是必须的.依赖关系可能也存在于一个代码单元要知道另一个 ...

  5. 3D数学读书笔记——3D中的方位与角位移

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25339595 方位和角位移 ...

  6. [读书笔记]java中的volatile关键词

    以下内容大多来自周志明的<深入理解Java虚拟机>. 当一个变量被volatile修饰后,它将具备两种特性: 1. 保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变 ...

  7. [读书笔记]java中的类加载器

    以下内容大多来自周志明的<深入理解Java虚拟机>. 类加载器是java的一项创新,也是java流行的重要原因之一,它最初是为了满足java applet的需求而开发出来. 什么是appl ...

  8. Pro Git 读书笔记

    一. 起步 1. 集中式版本控制缺点:中央服务器的单点故障. 分布式版本控制优点:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后 ...

  9. 锋利的jQuery读书笔记---jQuery中Ajax--get、post等方法

    load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现ajax的全部价值. 在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或 ...

随机推荐

  1. apache并发测试工具ab为什么测不准

    apache并发测试工具ab为什么测不准 发表于2年前(2013-03-21 12:13)   阅读(1146) | 评论(1) 1人收藏此文章, 我要收藏 赞0 3月21日 深圳 OSC 源创会正在 ...

  2. Android蓝牙A2DP连接实现

    代码地址如下:http://www.demodashi.com/demo/14624.html 开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果 ...

  3. CSS3饼状loading效果

    概述 之前看到很多饼状loading效果是用图片的方式实现的,本例子采用的是纯CSS3实现,这样可以节省资源空间,有兴趣的小伙伴可以看下~ 详细 代码下载:http://www.demodashi.c ...

  4. 总结PLSQL的快捷键以及使用技巧

    http://www.dedecms.com/knowledge/data-base/oracle/2012/0724/3643.html 最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他 ...

  5. 转 ShowSlow+Yslow页面前端性能测试环境搭建

    ----//工具介绍 Yslow:YSlow是Yahoo发布的一款基于FireFox的插件. YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. ShowSlo ...

  6. ssh/scp 远程连接ssh非默认端口方法

    ssh -p port <username>@<IP>

  7. Linux内核(3) - 分析内核源码如何入手(下)

    下面的分析,米卢教练说了,内容不重要,重要的是态度.就像韩局长对待日记的态度那样,严谨而细致. 只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花 ...

  8. LeetCode总结 -- 一维数据合并篇

    合并是一维数据结构中非经常见的操作, 一般是排序, 分布式算法中的子操作. 这篇总结主要介绍LeetCode中关于合并的几个题目: Merge Two Sorted ListsMerge Sorted ...

  9. GDI+绘制简单图形

    #include <windows.h>#include <gdiplus.h>using namespace Gdiplus;#pragma comment(lib, &qu ...

  10. MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段

    --查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...