ViewModelLocator
ViewModelLocator
这里先鼓舞下士气,ViewModelLocator很简单,甚至可以去掉,它不是Mvvm必须的。在初学Mvvm时,一般都是使用NuGet安装
MvvmLight框架,总是会带上那么一个ViewModelLocator,并且还加入到了全局资源中,到底是干吗的?
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<AppViewModel>();
}
public AppViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<AppViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
上面就是一个具有基本功能的试图模型定位器,它的作用就是访问ViewModel,你想用哪个ViewModel就在这里找,构造函数中首先注册一个AppViewModel类型
然后通过Main属性暴露出来,当我们访问Main属性的时候,就会把AppViewModel的实例返回,注意SimpleIoc默认是
单实例的,返回的是同一个Main。
注意:在构造该对象时,我们将MvvmLight自带的SimpleIoc容器指定作为默认服务提供者,
这里为什么要使用ServiceLocator又将SimpleIoc容器包裹一层,
其实在运行时,我们直接使用SimpleIoc也是没有问题的,
这里主要是考虑到一个设计时的显示效果,
设计时就能在设计窗口看到ViewModel中的数据。
接下来我们看如何使用ViewModelLocator,在使用NuGet安装MvvmLight时,会自动给我们的App.xaml加入一个Resource
<Application x:Class="MvvmDemo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
d1p1:Ignorable="d"
xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mvvmDemo="clr-namespace:MvvmDemo" StartupUri="Views/AppView.xaml">
<Application.Resources>
<mvvmDemo:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
</Application>
ViewModelLocator就作为一个全局资源引用到了程序中,注意在App类初始化时,就会去初始化ViewModelLocator。
这样我们在界面上就可以使用全局资源找到对应的ViewModel。
<Window x:Class="MvvmDemo.Views.AppView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:validationRules="clr-namespace:MvvmDemo.ValidationRules"
xmlns:converter="clr-namespace:MvvmDemo.Converter"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:command="http://www.galasoft.ch/mvvmlight"
Title="AppView" Height="300" Width="300" DataContext="{Binding Source={StaticResource Locator},Path=Main}">
</Window>
这里将AppView的DataContext设置为全局静态资源中的Main,此时,在VS的可视化窗口中,就会看到数据已经绑定上。
总结一下:这里我们首先有一个ViewModelLocator,然后又是资源,又是Binding,其实目的就是为了在设计时,能够
将数据友好的显示,即时看到效果。我们完全可以把这个ViewModelLocator删除,在AppView的构造函数中,将DataContext
设置为AppViewModel
public AppView()
{
this.DataContext=new AppViewModel();
}
当然呢,这种做法很粗鲁,设计时也不会看到绑定的数据。ViewModelLocator的作用就是这么点,也不是很复杂。
SimpleIoc
这个需要了解一下IOC是什么,这儿有一篇很好的文章,也很生动。
IOC的内容很大,在Mvvm中自带了一个Ioc容器,SimpleIoc,之所以叫SimpleIoc,是因为它的确很简单,仅仅是作为
对象容器来使用的。例如在设计时的数据可视化效果中,向View的DataContext提供对应的ViewModel。
实际开发中,我们会使用更加灵活的Ioc,例如:MEF,园子里有很不错的教程。
ViewModelLocator的更多相关文章
- WPF ViewModelLocator
在WPF中应用ViewModelLocator <Window x:Class="Demo.Views.MainWindow" ... xmlns:prism="h ...
- Nuget包CommonServiceLocator从1.0.3升级到2.0.4时MvvmLight的ViewModelLocator初始化SimpleIoc.Default格式不匹配问题
原文:Nuget包CommonServiceLocator从1.0.3升级到2.0.4时MvvmLight的ViewModelLocator初始化SimpleIoc.Default格式不匹配问题 把旧 ...
- MvvmLight - ViewModelLocator
这里先鼓舞下士气,ViewModelLocator很简单,甚至可以去掉,它不是Mvvm必须的.在初学Mvvm时,一般都是使用NuGet安装 MvvmLight框架,总是会带上那么一个ViewModel ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- Xamarin+Prism开发详解五:页面布局基础知识
说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...
- 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)
在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...
- UWP开发之Mvvmlight实践一:如何在项目中添加使用Mvvmlight(图文详解)
最近一直在做UWP开发,为了节省成本等等接触到MVVMlight,觉得有必要发点时间研究它的用法与实现原理才行.如果有问题的地方或者有好的建议欢迎提出来. 随着移动开发的热门,Mvvmlight在An ...
- Xamarin.Android和UWP之MVVM的简单使用(一)
0x01 前言 就目前而言,MVVM可以说是挺流行的,无论是web端还是移动端,web端的主要代表angularjs,avalonjs等, 移动端(xamarin,uwp)的代表应该是mvvmligh ...
- 【MVVM Light】新手初识MVVM,你一看就会
一.前言 作为一个初入软件业的新手,各种设计模式与框架对我是眼花缭乱的.所以当我接触到这些新知识的时候就希望自己能总结几个步骤,以便更好更方便的在日常工作中进行使用. MVVM顾名思义就是Model- ...
随机推荐
- JavaScript Patterns 7.1 Singleton
7.1 Singleton The idea of the singleton pattern is to have only one instance of a specific class. Th ...
- SQL Server 2012 学习笔记5
1. 索引(Index) 索引是快速的定位和查找数据.索引分为: 聚集索引:唯一,默认主键,一般选取比较连贯的字段,聚集索引是物理排序. 非聚集索引: 并没有把数据物理排序,只是多了一个索引页(包括索 ...
- sql server 跟踪各事件的字段项编码及解释
column_id有如下表:1 TextData 与跟踪内捕获的事件类相关的文本值. 2 BinaryData 与在跟踪中捕获的事件类相关的二进制值. 3 DatabaseID USE databas ...
- no CONFIG_BQL
[PATCH] net: make CONFIG_BQL actually end user configurable Without the defining string or help text ...
- Docker+OpenvSwitch搭建VxLAN实验环境
一.概述 1.环境:我这里是2台linux机器(host1和host2),发行版是kali2.0, ...
- Entity framework 级联删除注意事项
版本:EF6.0.1 RC 一对多场景,在子对象映射中开启级联删除情况下,删除父对象将自动删除其下所有子对象,需要注意一些事项: 需要保证DbContext中已经加载了该父对象的所有子对象. 如果Db ...
- GitHub注册流程(中英对比)
GitHub注册流程(中英对比) 注明:为方便完成注册,将以中英文网页截图对应展示. 1. 注册邮箱: 点击GitHub官网进行邮箱注册. 2. 制定个人计划: 页面跳转至 ...
- Java Web开发之分页(ajax)
1.需要用到的jar包.js文件 JSONArray().fromObject()需要的jar包: (1)commons-beanutils-1.8.3.jar (2)commons-collecti ...
- NOIP2015跳石头[二分答案]
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...
- Windows 常用 CMD 命令行介绍
看下面的链接: http://www.jianshu.com/p/76ff5d16f113