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- ...
随机推荐
- const,readonly 这些你真的懂吗? 也许会被面试到哦。。。
首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看ms ...
- 抛弃NVelocity,来玩玩Razor
对于内容型,不易变动的东西我们都希望给它来个静态化,还有种情况就是比如新浪云不支持.net,为了能跑起我们的网站, 只能放些静态页面上面,外加jsonp来实现交互,我们知道.net中有很多模板引擎,但 ...
- Join的表顺序
在今天的文章里,我想谈下SQL Server里一个非常有趣的话题:在表联接里,把表指定顺序的话是否有意义?每次我进行查询和性能调优的展示时,大家都会问我他们是否应该把联接中的表指定下顺序,是否会帮助查 ...
- Linux IPC tcp/ip socket 编程
模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...
- 用VC6开发嵌入式LINUX程序
黄山松 (Tom Huang) 发表于博客园http://www.cnblogs.com/tomview/ 首先说明一下,VC6自然不能直接开发LINUX程序,主要使用的是它的编辑环境而已,但是作为一 ...
- android 实现ImageView按压效果和解决背景图片拉申问题
建立一个.XML文件,名为:image_tab_bg.xml <?xml version="1.0" encoding="utf-8"?> < ...
- C# .NET 动态调用webservice的三种方式
转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...
- Eclipse安装python注意事项
第一次用Eclipse来开发python,在安装环境时走了很多弯路,下面记录下正确的安装方法: 1.下载Eclipse与jdk.(注意jdk与Eclipse要么都是32位,要么都是64位) 2.安装好 ...
- 鸿雁电器oa系统中决策支持模块效果
公司简介鸿雁电器是国内著名的建筑电器产品的生产.经营企业,同时也是国家863计划CIMS(计算机集成制造系统)应用工程示范企业.浙江省高新技术企业.浙江省专利示范企业和杭州市信息化试点企业.企业系统泛 ...
- 能跨域和跨浏览器的flashcookie for jquery插件
对于写网站时需要跨域和跨浏览器的可以看看这个. 引入jquery 和 swfstore.min.js 就可以了,蛮简单好用的,会jquery基础就可以咯. mySwfStore.set('myKey ...