DevExpressUniversalSubscription官方最新版免费下载试用,历史版本下载,在线文档和帮助文件下载慧都网 考虑像显示来自ViewModel的通知(例如,消息框)这样的微不足道的任务,作为可视化元素,任何消息框实际上都是视图的一部分。因此,如果你直接从ViewModel显示消息框(定义一个调用MessageBox。Show()方法的命令),这个简单的代码将破坏主要的MVVM概念ViewModels不能引用Views,并使其无法编写ViewModel的单元测试。为了解决这个困难,DevExpressMVVM框架实现了服务。 服务是一种IOC模式,它删除了ViewModel和View层之间的任何引用。在代码中,服务是在ViewModel代码中使用的接口,没有任何关于何时和如何实现该接口的假设。 您可以实现自己的自定义服务以及使用DevExpressServices,无论您使用什么服务,通用工作流程都保持不变:在代码中定义服务(如果您使用的是DevExpress已经实现的服务,则跳过);在特定的视图中注册它;在ViewModel中检索服务并使用其方法。DevExpressServices DevExpressMVVM框架已经为大多数常见任务提供了现成的服务显示消息、弹出窗口、对话框、添加应用程序UI管理器文档等。例如,以下ViewModel代码通过定义IMessageBoxService类型的属性来检索XtraMessageBoxService。 CViewModelpublicclassMyViewModel{protectedIMessageBoxServiceMessageBoxService{get{returnthis。GetServiceIMessageBoxService();}}} VB。NETViewModelPublicClassMyViewModelProtectedReadOnlyPropertyMessageBoxService()AsIMessageBoxServiceGetReturnMe。GetService(OfIMessageBoxService)()EndGetEndProperty 重要提示:GetService方法不是线程安全的,不应从后台线程调用。 对于POCOViewModel,您可以使用以下故障安全语法,该语法将自动使用this。GetService方法或在出现问题时引发异常。 CPOCOViewModelprotectedvirtualIMessageBoxServiceMessageBoxService{get{thrownewSystem。NotImplementedException();}} VB。NETPOCOViewModelProtectedOverridableReadOnlyPropertyMessageBoxService()AsIMessageBoxServiceGetThrowNewSystem。NotImplementedException()EndGetEndProperty 检索服务后,您可以在ViewModel中使用其方法: CpublicvoidSayHello(){MessageBoxService。Show(Hello!);} VB。NETPublicSubSayHello()MessageBoxService。Show(Hello!)EndSub 最后,在视图中注册您的服务。服务要么注册在本地容器中以在单个View中使用(本地服务),要么注册到允许您在整个应用程序中使用注册服务的全局静态(单例)服务容器(全局服务)。 CGlobalserviceDevExpress。Mvvm。ServiceContainer。Default。RegisterService(newSomeService());LocalserviceserviceContainer。RegisterService(newSomeFilterService(ModuleType。MyCustomFilter)); VB。NETGlobalserviceDevExpress。Mvvm。ServiceContainer。Default。RegisterService(NewSomeService())LocalserviceserviceContainer。RegisterService(NewSomeFilterService(ModuleType。MyCustomFilter)) 当创建ViewModel时,服务也可以在运行时在服务容器中注册。 Cthis。ServiceContainer。RegisterService(newServices。AnotherService()); VB。NETMe。ServiceContainer。RegisterService(NewServices。AnotherService()) 最后,您可以通过在此级别提供自定义服务实现来覆盖ViewModel层次结构中任何级别的父级服务实现。 CserviceContainer。RegisterService(newNotImplementedCustomService(ModuleType。MyMainView)); VB。NETserviceContainer。RegisterService(NewNotImplementedCustomService(ModuleType。MyMainView)) 使用MvvmContext组件,您无需记住这个底层服务容器机制。该组件的API提供了易于使用的方法来注册全局和本地级别的服务。 CStaticmethodthatregisterstheglobalDevExpressXtraDialogServiceMVVMContext。RegisterXtraDialogService();RegisterstheService1serviceinthedefaultservicecontainer(globalservice)mvvmContext1。RegisterDefaultService(newService1());RegistersthelocalService1forusewithinthecurrentViewonlymvvmContext1。RegisterService(newService2()); VB。NETStaticmethodthatregisterstheglobalDevExpressXtraDialogServiceMVVMContext。RegisterXtraDialogService()RegisterstheService1serviceinthedefaultservicecontainer(globalservice)mvvmContext1。RegisterDefaultService(NewService1())RegistersthelocalService1forusewithinthecurrentViewonlymvvmContext1。RegisterService(NewService2()) 许多随时可用的服务已经在全局静态容器中注册,因此您甚至不需要手动注册它们。删除MessageBox服务演示中的RegisterMessageBoxService方法调用,您会注意到该服务仍在工作。 如果需要,您可以重新定义这些服务注册,为此请使用MVVMContext类的相应静态Register。。。方法。例如,XtraMessageBoxService和FlyoutMessageBoxService示例的ViewModel与第一个示例的ViewModel相同。所有三个ViewModel都检索实现IMessageBoxService的服务,但是使用不同的静态Register。。。方法会强制使用不同的服务。 相同的方法允许来自DialogServices组的示例显示不同的对话框,尽管ViewModel代码是相同的。 CprotectedIDialogServiceDialogService{get{returnthis。GetServiceIDialogService();}} VB。NETProtectedReadOnlyPropertyDialogService()AsIDialogServiceGetReturnMe。GetService(OfIDialogService)()EndGetEndProperty 由于注册不同服务的视图代码而调用不同的对话框。 CXtraDialogserviceMVVMContext。RegisterXtraDialogService();FlyoutDialogserviceMVVMContext。RegisterFlyoutDialogService(); VB。NETXtraDialogserviceMVVMContext。RegisterXtraDialogService()FlyoutDialogserviceMVVMContext。RegisterFlyoutDialogService() DevExpressWinForm DevExpressWinForm拥有180组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!