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()方法(或 ...
随机推荐
- java Socket Tcp 浏览器和服务器(二)
package cn.itcast.net.p2.ie_server; import java.io.IOException;import java.io.InputStream;import jav ...
- 前端工程精粹(一):静态资源版本更新与缓存(附精简js的工具)
转自:http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part1/ 每个参与过开 ...
- Spark GraphX 的数据可视化
概述 Spark GraphX 本身并不提供可视化的支持, 我们通过第三方库 GraphStream 和 Breeze 来实现这一目标 详细 代码下载:http://www.demodashi.com ...
- HDUOJ----Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping! Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K ...
- HDUOJ---(2203)亲和串
亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 在python中使用静态方法staticmethod
静态方法: 静态方法是类中的函数,不需要实例.静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作.可以理解为将静态方法存在 ...
- OAF_OAF OAWebBean和OAPageContext的分析(概念)
2015-04-03 Created By BaoXinjian
- USB的中断说明
STM32的USB模块可以产生三种中断:USB唤醒中断.USB高优先级中断和USB低优先级中断,在STM32的参考手册中没有详细说明这三种中断对应哪些事件,现说明如下: 1)USB唤醒中断:在中断向量 ...
- MyEclipse中常用的快捷键大全
http://www.cnblogs.com/wl0000-03/p/5953989.htmlMyEclipse中常用的快捷键大全 复制当前行到下(上)一行中:ctrl+alt+上下键 自动补全alt ...
- InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings In
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is s ...