文档章节

Pro mvvm读书笔记mvvm中的VM

h
 haiziguo
发布于 2016/12/09 11:42
字数 548
阅读 4
收藏 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
0
当我们使用 MVVM 模式时,我们究竟在每一层里做些什么?

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

WPwalter
2017/11/30
0
0
Mvvm设计模式

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

村长大神
2015/04/24
161
0
关于Android MvvM的一些体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zly921112/article/details/82849549 前言 由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页...

zhuliyuan丶
09/26
0
0
使用Kotlin构建MVVM应用程序—提高篇:ViewModel

写在前面 大家好,这里是使用Kotlin构建MVVM应用程序—提高篇:ViewModel。 本篇文章将介绍google推荐的架构组件ViewModel的使用方法及实现原理。 为什么要有ViewModel? 为什么?看到ViewMod...

ditclear
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 程序员左轮轮盘赌注

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bon Jovi的单曲《You Give Love a Bad Name》 《You Give Love a Bad Name》- Bon Jovi 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
23分钟前
262
10
oracle 用户密码过期-ORA-28001: 口令已经失效

oracle 用户密码过期-ORA-28001: 口令已经失效 操作步骤: [BEGIN] 2018-10-23 17:25:43Last login: Mon Sep 3 08:46:32 2018 from 10.2.202.12#登陆数据库#(1)在命令窗口中输入:...

诺岚
27分钟前
1
0
[转载]Yarn作业提交流程

1、yarn简述 yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式操作系统平台,而mapreduce等运算程序则相当于运行与操作系统之上的应用程序。yarn在hadoop2.x系列...

hnairdb
31分钟前
0
0
WebSocketdemo

WebSocket是html5提供的一种在单个tcp连接上进行全双工通讯的协议。 Http协议是无状态、无连接的、单向的应用层协议,采用了请求响应模型,通信请求智能有客户端发起,服务端对请求做出应答处...

qiang123
37分钟前
1
0
谷歌推迟公布Google+漏洞遭参议员不满

参议院商务委员会主席约翰·图恩和另外两位参议员杰瑞·莫兰和罗杰·维克发出信函,要求谷歌解释推迟披露此问题的原因。信中称:“谷歌如果要保持或重获用户对其服务的信任,就必须在公众和立...

linuxCool
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部