MvvmLight框架使用入门(三)

MvvmLight框架使用入门(三)

  本篇是MvvmLight框架使用入门的第三篇。从本篇开始,所有代码将通过Windows 10Universal App来演示。我们将创建一个Universal App并应用MvvmLight框架。

  首先通过VS2015创建一个名为UniversalApp的空工程(工程类型为Universal Windows),然后通过NuGet获取MvvmLight,这里需要注意的是,我们选择MvvmLightLib仅下载DLL文件,因为MvvmLight还未对Universal App做适配,并不会自动创建ViewModel以及ViewModelLocator等文件。

  在创建UniversalApp完成后,将上一篇创建的HelloMvvmLight工程中的ViewModel文件夹整个拷贝到UWP工程里(注意修改namespace)。这样MainViewModel以及ViewModelLocator文件就有了。

接着在App.xamlResources中添加对ViewModelLocator的引用:

    <Application.Resources><ResourceDictionary><vm:ViewModelLocator x:Key="Locator" /></ResourceDictionary></Application.Resources>

  这里需要注意保持namespaceViewModelnamespace一致:xmlns:vm="using:UniversalApp.ViewModel"

  再下一步就是修改MainPage.xaml文件,将xaml的内容修改如下:

复制代码
    <Page.DataContext><Binding Path="Main" Source="{StaticResource Locator}"></Binding></Page.DataContext><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"></RowDefinition><RowDefinition Height="Auto"></RowDefinition></Grid.RowDefinitions><TextBlock Text="{Binding Title}"></TextBlock><Button Grid.Row="1" Command="{Binding ChangeTitleCommand}">Click Me!</Button></Grid>
复制代码

  至此,一个简单的使用了MvvmLight框架的Uinversal App就完成了。

  按下Ctrl+F5,一个Win10风格的窗体就出现了。(细心的童鞋会发现Button默认不再撑开了)

  当然本篇不会只有这点东西,我们会进一步介绍MvvmLight框架在Universal App下的使用。

  接下来我们增加第二个页面,来看一下MvvmLight对页面间导航的支持。

  第一步新建PageTwoViewModel类:

复制代码
    public class PageTwoViewModel{private INavigationService _navigationService;public ICommand GoBackCommand { get; set; }public PageTwoViewModel(INavigationService navigationService){_navigationService = navigationService;GoBackCommand = new RelayCommand(()=> { _navigationService.GoBack(); });}}
复制代码

  INavigationServiceMvvmLight为了抽象各类型的工程(WPF,Silverlight,Windows Runtime)不同的导航方法,而设计的接口,定义如下:

复制代码
    public interface INavigationService{string CurrentPageKey { get; }void GoBack();void NavigateTo(string pageKey);void NavigateTo(string pageKey, object parameter);}
复制代码

  通过string字符串确认唯一页面来进行跳转和返回,并可以传递object类型的参数。

  ViewModelLocator类注册PageTwoViewModel,以及创建INavigationService的实例并关联各Page

复制代码
        public ViewModelLocator(){ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);SimpleIoc.Default.Register<MainViewModel>();SimpleIoc.Default.Register<PageTwoViewModel>();var navigationService = this.CreateNavigationService();SimpleIoc.Default.Register<INavigationService>(() => navigationService);}private INavigationService CreateNavigationService(){var navigationService = new NavigationService();navigationService.Configure("MainPage", typeof(MainPage));navigationService.Configure("PageTwo", typeof(PageTwo));return navigationService;}public MainViewModel Main{get{return ServiceLocator.Current.GetInstance<MainViewModel>();}}public PageTwoViewModel PageTwo{get{return ServiceLocator.Current.GetInstance<PageTwoViewModel>();}}}
复制代码

  至于为什么只要在PageTwoViewModel的构造函数参数中带有INavigationService,即可由IOC自动获取实例navigationService则超出了本文讨论的范围,有兴趣的同学自行学习。

  构建PageTwo.xaml页面并关联至PageTwoViewModel

复制代码
    <Page.DataContext><Binding Path="PageTwo" Source="{StaticResource Locator}"></Binding></Page.DataContext><Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"></RowDefinition><RowDefinition Height="Auto"></RowDefinition></Grid.RowDefinitions><TextBlock Text="Page Two"></TextBlock><Button Grid.Row="1" Command="{Binding GoBackCommand}">Go Back</Button></Grid></Grid>
复制代码

  修改MainViewModel类,增加GotoNextCommand等方法。同时我们可以看到手动获取navigationService对象的方法。

复制代码
    public class MainViewModel : ViewModelBase{private string title;public string Title{get { return title; }set { Set(ref title , value); }}public ICommand ChangeTitleCommand { get; set; }public ICommand GotoNextCommand { get; set; }public MainViewModel(){Title = "Hello World";ChangeTitleCommand = new RelayCommand(ChangeTitle);GotoNextCommand = new RelayCommand(GotoNext);}private void GotoNext(){var navigationService = ServiceLocator.Current.GetInstance<INavigationService>();navigationService.NavigateTo("PageTwo");}private void ChangeTitle(){Title = "Hello MvvmLight";}}
复制代码

  MainPage.xaml仅仅是增加了一个GotoNextButton

<Button Grid.Row="2" Command="{Binding GotoNextCommand}">Go to Next!</Button>

  大功告成,按下Ctrl+F5试试吧。

  使用MvvmLight框架中的INavigationService来进行页面导航,虽然相对使用Frame导航稍稍增加了工作量,但具有以下几点好处:

  1.   不依赖具体的工程实现(WPF,Sliverlight,Windows Runtime)
  2.   ViewViewModel不直接产生依赖,双方通过中介INavigationService打交道。也就是说ViewModel中不会出现Windows.UI.Xaml.Controlsnamespace
  3.   将跳转的实现代码从View转移到ViewModel,使得单元测试可以脱离View,完全的通过ViewModelUT即可测试跳转的逻辑。

 

转载于:https://www.cnblogs.com/Jeely/p/11077818.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch LSTM实例2

对Pytorch中LSTM实例稍作修改,这是一个词性标注的实例 #导入相应的包 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optimtorch.manual_seed(1)#准备数据的阶段 def prepare_sequence(seq, to_ix):idxs = [to_ix[w] for w in …

java更好的语言_Java,如果这是一个更好的世界

java更好的语言只是梦想着有一个更好的世界&#xff0c;在该世界中&#xff0c;Java平台中的一些旧错误已得到纠正&#xff0c;而某些令人敬畏的缺失功能也已实现。 不要误会我的意思。 我认为Java很棒。 但是它仍然存在一些问题&#xff0c;就像其他平台一样。 我没有任何特定…

anaconda安装成功测试_学习笔记120—Win10 成功安装Anaconda 【亲测有效,需注意几点!!!】...

Win10 下安装 Anaconda一、下载安装 Anaconda(勾选 PATH)&#xff1a;Anaconda 是专注于数据分析的 Python 发行版本&#xff0c;包含了 conda、Python 等 190 多个科学包及其依赖项。使用 Anaconda 的好处在于可以省去很多配置环境的步 骤&#xff0c;省时省心又便于分析。下载…

Pytorch 词嵌入word_embedding1初识

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)参数所表示的含义: num_embeddings (int) :嵌入字典的大小 embedding_dim (int) :每个嵌入向量的大小 padding_idx (int, optio…

Python语言 目录

待续.... 转载于:https://www.cnblogs.com/jiangchunsheng/p/11077884.html

JDK 9清单:Project Jigsaw,sun.misc.Unsafe,G1,REPL等

Java 9距离&#xff08;希望&#xff09;数月了&#xff0c;现在该讨论一下即将发生的变化以及您应该采取的措施 Java 9即将来临&#xff08;我们正在计算到达的日子 &#xff09;&#xff0c;其中包含一系列新功能和改进功能。 这就是为什么我们决定创建一份清单来准备自己的…

Pytorch 词嵌入word_embedding2实例(加载已训练词向量)

目录 1、加载已训练好的词嵌入 2、是否需要重新训练词嵌入 3、不重新训练词嵌入时优化器设置

IPv4数据报格式及其语义

IPv4数据报格式及其语义 一、IP数据报的格式如下图所示 版本 首部长度 服务类型 数据报长度 16比特标识 标志 13比特片偏移 寿命 上层协议 首部检验和 32比特源IP地址 32比特目的IP地址 选项&#xff08;如果有的话&#xff09; 数据 IPv4数据报格式 二、各部分语…

华景机器人怎么控制_【华景QQ机器人怎么用】华景QQ机器人好不好_使用技巧-ZOL软件百科...

发布日期&#xff1a;2016年02月21日 Release 2 && Release 3新增功能和优化及修复修复严重崩溃问题。全面支持emoji表情。修复某些用户不能登录。轻量级重包处理。优化消息显示。修复一个数组越界错误。修复一个数组下标不能为0错误。加快消息处理速度。UI线程与消息处…

Java命令行界面(第9部分):parse-cmd

parse-cmd库由单个类ParseCmd.java组成&#xff0c;该类是“用于在Java应用程序中定义和解析命令行参数的Java类。” 该库托管在Google Code存档上 &#xff0c;因此可以随时关闭 。 该JAR似乎也可以在GitHub上使用 。 这篇文章介绍了如何使用parse-cmd 0.0.93处理Java中的命令…

Pytorch--Tensor, Numpy--Array,Python--List 相互之间的转换

1、 Python--List Numpy--Array list = [[1, 2, 4, 8], [0.1, 0.4, 0.9, 0.8]] list_np = np.array(list) print(list_np的维度:,list_np.shape) print(list_np的类型:,type(list_np))运行结果: 2、Python--List Pytorch--Tensor test = [[1, 2, 4, 8], [0.1, 0.4, 0…

Redis的各项功能解决了哪些问题?

Redis是什么 官方简介解释到&#xff1a;Redis是一个基于BSD开源的项目&#xff0c;是一个把结构化的数据放在内存中的一个存储系统&#xff0c;你可以把它作为数据库&#xff0c;缓存和消息中间件来使用。 同时支持strings&#xff0c;lists&#xff0c;hashes&#xff0c;set…

join left semi_HIVE--left semi join

实验&#xff1a;hive> select * from b1;OK1 003 201705111 004 201705121 005 201705132 006 201705143 007 20170515Time taken: 0.041 secondshive> select * from b2;OK1 005 201705132 006 …

java permgen_Java 8:从PermGen到元空间

java permgen您可能已经知道&#xff0c;现在可以下载JDK 8 Early Access 。 这使Java开发人员可以尝试Java 8的某些新语言和运行时功能。这些功能之一是完全删除自Oracle自JDK 7发行以来就宣布的Permanent Generation&#xff08;PermGen&#xff09;空间。例如&#xff0c;自…

总结

写在前面 课程名称&#xff1a;软件工程原理及方法 课程链接&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3393 团队名称&#xff1a;求莫名堂 请…

Pytorch GRU(详解GRU+torch.nn.GRU()实现)

pytorch GRU 目录 pytorch GRU 一、GRU简介1 二、GRU简介2 三、pytorch GRU 3.1 定义GRU ()

同步装饰器来替换线程安全类

您知道什么是线程安全吗&#xff1f; 如果没有&#xff0c;下面是一个简单的示例。 所有类都必须是线程安全的&#xff0c;对吗&#xff1f; 并不是的。 其中一些必须是线程安全的&#xff1f; 又错了。 我认为它们都不必是线程安全的&#xff0c;而它们都必须提供同步的装饰器…

creo减速器建模实例_3.16减速器箱体附件建模

本节内容主要介绍了减速器箱体附件建模&#xff0c;视频时长24分32秒。本节主要通过阵列&#xff0c;拉伸&#xff0c;孔等命令完成创建&#xff0c;操作时注意孔的类型的选择&#xff0c;以及定位基准的选择&#xff0c;学习时要掌握其减速器附件的设计。简要操作步骤&#xf…

回文数

问题 A: 回文数 时间限制: 1 Sec 内存限制: 32 MB提交: 1705 解决: 512[提交][状态][讨论版]题目描述 我们把从左往右和从右往左念起来相同的数字叫做回文数。例如&#xff0c;75457就是一个回文数。当然某个数用某个进制表示不是回文数&#xff0c;但是用别的进制表示可能就…

Pytorch RNN(详解RNN+torch.nn.RNN()实现)

目录 一、RNN简介 二、RNN简介2 三、pytorch RNN 3.1 定义RNN()