文档章节

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
使用Kotlin构建MVVM应用程序—提高篇:ViewModel

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

ditclear
07/04
0
0
《Android构建MVVM》系列(一) 之 MVVM架构快速入门

前言   本文属于《Android构建MVVM》系列开篇,共六个篇章,详见目录树。   该系列文章旨在为Android的开发者入门MVVM架构,掌握其基本开发模式。   辅以讲解Android Architecture Co...

昕无旁骛
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
昨天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
昨天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
昨天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
昨天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部