MVVMLight与ToolKit 一、MVVMLightMVVMLight与prism区别如果把开发一个 WPF 或 MAUI 应用程序比作开一家餐厅那么MVVM Light和Prism就是两种完全不同的经营思路MVVM Light像一个“便携式工具箱”。它不教你大公司怎么管理只是送你几件趁手的兵器如ViewModelBase、RelayCommand、Messenger。你可以在任何旧项目里随时掏出来用没有任何束缚自由度极高适合中小型项目或快速迭代。Prism像一套“五星级酒店的管理标准”。它不仅给你工具还规定了厨房怎么排班模块化、前台怎么接待导航系统、各个部门怎么沟通事件聚合器。它有一套强大的企业级规范适合大型、需要长期维护、多人协作的复杂项目。一.数据绑定Set,命令RelayCommandViewModelBase:viewModel的基类,实现INotifyProperdChangedObservableObject:轻量级观察对象RelayCommand:命令对象ObservableObject继承了ViewModelBase,一般项目中继承ObservableObject即可,如果实现了ObservableObject就用Set()进行属性通知,RelayCommand相当于命令public MainWindowView: ObservableObject public string name public string Name{ get{return name;} set{ Set(ref name , value); //这样属性通知比RaisePropertyChanged性能更高,如果用RaisePropertyChanged(name )会连带其他属性通知给view,浪费性能,Set则不会 } public RelayCommandstring TextCnm{get;} public MainWindowView(){ TextCnm new RelayCommandstring((str) { MessageBox.show(str); } ) } }二.Dispather跨线程调用用法Dispather.CheckBegin:异步,退快递放到门口让快递员自己拿Dispather.invoke:同步,当着快递员的面退快递在异步方法中尽量用第一种,急需返回值的话可以用第二种同步方法,否则用第一种三.Messenger通信1,view和viewModel或view之间数据传输通信,类似订阅为什么下面叫接收注册,相当于接收方在传输前建立同信,需要点击接收按钮变相的注册到发送方,再开始传输发送:Messenger.send类型(参数)接收:Messenger.Default.Unregister类型(this,执行的方法)执行的方法(接收发送的参数){执行代码}2.一个发送,多个接收不同类型,接收方只需根据类型接收同一类型,则根据令牌唯一值去接收3.发送中包含委托定义消息与发送消息注册并接收消息四.注册SimpleIoc在app.xml中注册对应接口和实例,以下任选一种方式引用SimpleIoc与Prism 注册的区别SimpleIoc功能单一只是一个纯粹的键值对容器负责把接口映射到类或者管理 ViewModel 实例,靠静态单例Default来拿实例。。Prism 的注册体系除了基础服务的注册Prism 的注册列表里还承担了大量的框架核心功能绑定。例如页面导航注册containerRegistry.RegisterForNavigationBlankView, BlankViewModel()对话框服务注册containerRegistry.RegisterDialogNotificationDialog, NotificationDialogViewModel()这些是SimpleIoc无法直接做到的因为 Prism 的容器与它的路由、区域Region系统深度绑定。五.视图模型定位器VMLocator1.新建VMLocator类,注册视图模型,并定义视图模型属性2.app.xml中配置VMLocator类信息,这样系统启动后直接加载3.视图层通过绑定上面的属性来绑定上下文MainWindowVM二.CommunityToolkit.MVVM1.ObservableProperty注解特性此注解直接代替下面Name属性getset方法,一个注解搞定,前提需要继承ObservableProperty2.校验属性值注解MinLengh2.NotifyPropertyChangedFor注解两个属性拼接时可以使用此注解,只要其中一个属性改变那么拼接好的属性也会随着改变3.RealCommand命令特性使用RealCommand请注意命令校验属性方法CanExe方法中添加校验来判断命令是否能执行方法并发启用禁用,命令注解1.注解含义:属性值改变了就会通知使用这个属性的方法2.鼠标点击后是否置灰,禁止多次点击3.RealyCommand注解自动根据方法名称生成命令,异步任务带取消令牌1.canExecute声明取消方法2.方法参数中定义取消令牌,参数要写到最后一位3.生成取消方法IncludeCancel,不要再去写取消方法代码了4.taycatch捕捉异常4.ObservableRecipient消息通知1.广播属性变化Broadcast当属性值改变时发送广播给接收方,图中的Broadcast为广播发送底层方法,可以拿出来进行重写用于记录属性新旧值改变记录sengdMsg绑定的按钮,点击这个按钮就会改变name属性值,从而达到广播的作用2.获取消息新旧值发送方需要接收方的回复,来处理特定业务可以使用此方式3.ObservableValidator特性NotifyDataErrotInfo实时自动校验类中改变的属性,ValidateAllProperties手动触发所有校验注解跑一遍1.为空校验,ErrorMessage是校验失败后消息提示内容2.错误信息显示属性,报错信息会赋值到这个属性上3.如文本框内容为空,在点击确定按钮的情况下,是不会报错误信息,因为没有像鼠标点入文本框那样触发校验,所以加了这个方法,在点击确认按钮的情况下也会校验4.只要继承了ObservableValidator类,如有报错就为true5.报错过多可以用此方式直接下一行展示,再将报错信息赋值给属性5.IOC1.程序的ioc提供者,有了此对象可以创建IOC2.IOC容器3.实例调用时创建的方式,addScoped在同样的请求中不会重复创建4.ioc容器进行实例化1.从容器中获取对应的实例