文档章节

Pro mvvm读书笔记mvvm中的VM

h
 haiziguo
发布于 2016/12/09 11:42
字数 548
阅读 4
收藏 0
点赞 0
评论 0

一、构建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;
    }
}

本文转载自:http://www.cnblogs.com/lzhp/p/3294900.html

共有 人打赏支持
h
粉丝 0
博文 32
码字总数 0
作品 0
东城
程序员
iOS架构设计勘误

镇楼.png 原文链接:https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52 一.前言 之前一直只是知道MVC/MVP/MVVM/VIPER这几个架构设计. 而且在实际工作中也都是...

Sunxxxxx丶 ⋅ 2017/12/05 ⋅ 0

当我们使用 MVVM 模式时,我们究竟在每一层里做些什么?

这篇文章不会说 MVVM 是什么,因为讲这个的文章太多了;也不会说 MVVM 的好处,因为这样的文章也是一搜一大把。我只是想说说我们究竟应该如何理解 M-V-VM,当我们真正开始写代码时,应该在里...

WPwalter ⋅ 2017/11/30 ⋅ 0

Mvvm设计模式

最近前端圈子里面,发现大家都在热炒概念,什么knockout,angularJs,都被捧成神了,鄙人不才,最近心情也不好,特地写这篇文章来找骂 写代码的码农都知道,Java社区虽然不是一个提出分层思想...

村长大神 ⋅ 2015/04/24 ⋅ 0

WP7的MVVM模式

对于WP7应用开发来说理解MVVM是十分重要的,MVVM全称是Model View ViewModel,对于微软.Net的应用来说MVVM和MVC有联系呢? Zune123提示大家无论是MVVM还是MVC都可以很好的把逻辑和UI分离,都很...

鉴客 ⋅ 2012/02/24 ⋅ 0

mvvm中,请问vm如何独立调试?

如题,看到你一条博客,自己也遇到了问题,mvvm调试没有那么顺手,请问mvvm结构中vm如何独立调试?

zxf10523 ⋅ 2015/01/21 ⋅ 0

使用Kotlin构建更适合Android的MVVM应用程序

概述 说到MVVM,大家都会想起前端的MVVM框架,相较于前端MVVM的火热,它在移动开发领域就不那么热门了。Google在2015年才推出DataBinding框架,起步较晚,而且2015年是MVP模式爆发的一年,2...

ditclear ⋅ 2017/11/28 ⋅ 0

[干货分享]一篇可能会让你爱上MVVM与ReactiveCocoa的文章

概要 在此工程中,本文将讨论将MVC改造为MVVM需要的一些基本方法,同时会适当穿插部分关于MVVM概念性的讨论!本文最大的意义在于,提供了一种读者可以复现的方式,逐步引出从MVC向MVVM尽可能平滑过...

ios122 ⋅ 2015/10/23 ⋅ 9

使用Kotlin构建更适合Android的MVVM应用程序

简书地址:www.jianshu.com/p/77e42aebd… 概述 说到MVVM,大家都会想起前端的MVVM框架,相较于前端MVVM的火热,它在移动开发领域就不那么热门了。Google在2015年才推出DataBinding框架,起步...

ditclear ⋅ 2017/11/28 ⋅ 0

Silverlight的MVVM模式

M是模型层,实际上就是客户端得数据服务层,而V是页面,即视图层,VM是视图的模型层,也可以看做是M和V之间的桥接层。 我们知道在数据库编程中,特别是Delphi中的数据库编程中,数据感知控件...

junwong ⋅ 2012/03/09 ⋅ 0

小之的架构之路——Android MVVM 面向接口型框架封装和单元测试

大家好,今天给大家带来一个我自己开发改造的 MVVM 封装框架。代码不难,但我更想说一些我在开发这样一个架构过程中的想法和思路,我们不仅要善于作一个搬运工,更要自己多多造轮子,我们程序...

小之丶 ⋅ 2017/10/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部