内容简介:接下来简单使用下:ML这个框架在App.xaml里面,加了个统一管理VM对象的类ViewModelLocator,这个类是WPF启动还是在开发时候都会加载的一个类。
接下来简单使用下:
ML这个框架在App.xaml里面,加了个统一管理VM对象的类ViewModelLocator,这个类是WPF启动还是在开发时候都会加载的一个类。
对应App.xaml.cs就一个方法,Dispatcher初始化,这样界面线程调用方法就会有对象了,我看了实现的代码,
在WPF中,有个代码 UIDispatcher = Dispatcher.CurrentDispatcher;还有一些在切换到界面线程操作,他都会check一下,如果可以使用就切换界面线程然后 执行指定的action。
AY我看了一些ML的源代码。
看完整个初始化项目,AY跟大家总结一下,
ViewModelLocator是个开发时候或者运行时候,用SimpleIOC 注册和加载vm的对象。
static ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); if (ViewModelBase.IsInDesignModeStatic) { SimpleIoc.Default.Register<IDataService, Design.DesignDataService>(); } else { SimpleIoc.Default.Register<IDataService, DataService>(); } SimpleIoc.Default.Register<MainViewModel>(); }
这些代码,同样,他判断是否是开发时还是运行时,他这里写了1个数据操作接口,然后,1个提供 设计时的 演示数据,还有个是运行时候的实现,二者类,分别利用IOC 进行映射,从而让界面的model有数据。
所以
这几个文件我们讲完了。
最后一行,是把MainViewModel对象注册进去。
注册进去后,对外暴露 Main属性,方便view界面去拿 这个实体的实例,我们通过IOC可以控制实例,比如说 单例,拿完实例后,继续拿都是同一个对象,也可以每次都是新对象。
/// <summary> /// Gets the Main property. /// </summary> [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "This non-static member is needed for data binding purposes.")] public MainViewModel Main { get { return ServiceLocator.Current.GetInstance<MainViewModel>(); } }
最后1行代码是
/// <summary>
/// Cleans up all the resources.
/// </summary>
public static void Cleanup()
{
}
用于你清理对象,ML在MainWindow的xaml.cs代码对Closing事件 调用的。
接下来我们看看MainViewModel类,页面的VM层
通过这里,我们看到 VM是继承 ViewModelBase的,所以我们新建页面,然后VM时候也要这样做,感觉目前手动建立有点累,你可以写项目模板再试。
第一行 IDataSetvice接口有个实例,因为我们在 ViewModelLocator的静态构造函数,向SIMPLEIOC中注册了实例。
SIMPLEIOC通过传统的构造函数 注入,所以此时_dataService是个实例了,,这就是IOC其中1个注入方式,构造函数注入,一般都是3种,还有方法参数注入,还有属性注入,微软的MEF也是IOC,用起来很舒服,WPF的标配。我曾经在NAudio项目看到 用的还不错。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
在其中一个接口的实现中,传入了DataItem类型的实例item对象,所以在MainViewModel的GetData时候 匿名参数item可以点出Title属性获得值。
其实这里ML框架取数据干嘛的,表面上感觉数据弄复杂了,其实设计的很巧妙,第一,展示了 测试数据和 真实数据两种,第二也展示了 业务属性和 界面上的属性的分离。我们可以理解IDataService是DDD领域开发的接口层,通过IOC有对应实现,然后你在构造函数中获得,然后赋值给界面的绑定的属性上,从而让界面显示。 这里感觉有个问题,就是应该设计 假如网络请求方式调用数据,应该加个异步等待。不然界面会卡死。
在经历过 一番折腾 ,MainViewModel的WelcomeTitle属性终于有值了。那么界面怎么绑定的 MainViewModel呢?
答案在MainWindow.xaml里面有一行代码
这个啊,就是在App.xaml中定义的资源的引用,有个Key名字为Locator的资源,资源里面有个Main属性的对象,所以 xaml界面只跟ViewModelLocator类有耦合,跟MainViewModel耦合不大,在这里还可以管理MainViewModel的生命周期。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
关于页面的xaml的样式资源什么的,ML默认把他单独放在一个资源字典,在界面上引用资源字典,这都是wpf基础知识了。所以下面2个东西也讲完了。
到此,默认ML的项目分解完了
接下来讲一下基础的命令操作。
在MainWindow加一个按钮
<Grid x:Name="LayoutRoot"> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="48"/> </Grid.RowDefinitions> <TextBlock FontSize="36" FontWeight="Bold" Foreground="Purple" Text="{Binding WelcomeTitle}" VerticalAlignment="Center" HorizontalAlignment="Center" TextWrapping="Wrap" Grid.RowSpan="2" /> <Button Grid.Row="1" Content="切换文字" Command="{Binding SwitchAY}"></Button> </Grid>
加一个命令
/// <summary> /// Initializes a new instance of the MainViewModel class. /// </summary> public MainViewModel(IDataService dataService) { _dataService = dataService; _dataService.GetData( (item, error) => { if (error != null) { // Report error here return; } WelcomeTitle = item.Title; }); SwitchAY = new RelayCommand(() => { WelcomeTitle = "Hello AY MvvmLight"; }); } ////public override void Cleanup() ////{ //// // Clean up if needed //// base.Cleanup(); ////} public ICommand SwitchAY { get; set; }
运行
单击按钮
在AYUI中,全都是MVC.Action和Mvc.Parameter和Mvc.Event,还有是否发送事件参数,也无需后台代码,而在ML框架中,如果控件没有Command,你需要使用Blend的行为知识。
AYUI批量路由中,可以在xaml中 输入 aymvc,然后tab tab就可以快捷创建路由代码,还支持过滤器的功能,让你在绑定的时候就执行过滤器。
AYUI迁移了ML框架的 消息,在AYUI中使用aysen+tab+tab快速创建消息send代码,使用ayreg+tab+tab快速创建注册代码。
在ML中 ,手动触发属性变化通知,是下面2个
在AYUI中是 OnProperyChanged("属性名"),当然也有批量通知。
在ML中,如果加1个新页面,你需要 一个xaml,一个对应的ViewModel,然后需要在ViewModelLocator中注册下,然后xaml页面顶部指定下属性,然后再对应ViewModel写代码,界面绑定。
在AYUI中,你需要右键解决方案,新建MVC页面即可,
xaml页面,可以快捷切换到Model和Controller
在controller也可以快速切换到 View和Model,在Model里,当然也可以快速切换到View和Controller,xaml.cs通过view上按F7快捷键进入。
AYUI有很完善的控件库,助你完成项目,还有 MVC的辅助快速类,比如在xaml上的GridService和AlignmentService等七八种,快速写页面,
AYUI也有动画库,有示例,你可以结合写很绚丽的项目。
AYUI更多东西,等待发现。
先讲到这里 ,这一篇博客,我们分解了 ML框架默认创建的项目,讲解一些开发流程。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
推荐您阅读更多有关于“”的文章
以上所述就是小编给大家介绍的《AY讲解一些自己对MVVMLight的理解[2]》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- C++动态内存管理好难怎么办?零基础图文讲解,小白轻松理解原理
- WebSocket技术讲解
- Fetch 的实例讲解
- SnapHelper硬核讲解
- reactivecocoa基础讲解
- Webpack原理简单讲解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。