提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:龚雪|2022-03-23 09:49:48.930|阅读 182 次
概述:本系列内容将开始根据DevExpress WinForms MVVM创建示例应用程序,本文继续讲解主视图导航的创建。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
在之前的介绍中,您已经拥有了ViewModel和相关视图,其中功能区项绑定到命令。但是主视图中的功能区项目是假的并且没有绑定到任何东西,因此从起始视图导航是不可能的,首先为这些按钮添加功能。
1. 要实现主视图导航,请注册相应的导航服务。之前的教程中提到了所选容器的类型会影响您需要使用的服务,您可以根据内容容器选择使用的服务。
如果您在视图中使用了 DocumentManager 组件,请注册 DocumentManagerService,在设计时或代码中执行此操作。
C#
mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1));
VB.NET
mvvmContext1.RegisterService(DocumentManagerService.Create(tabbedView1))
2.将功能区项目绑定到将打开特定应用程序模块的命令,主ViewModel继承了 DocumentsViewModel,它也是由 Scaffolding Wizard 生成的。 此 ViewModel 提供了所需的功能:用于存储应用程序模块的 Modules 集合......
C#
public TModule[] Modules { get; private set; }
VB.NET
Private privateModules As TModule() Public Property Modules() As TModule() Get Return privateModules End Get Private Set(ByVal value As TModule()) privateModules = value End Set End Property
…以及显示它们的 Show 方法。
C#
public void Show(TModule module) { ShowCore(module); } public IDocument ShowCore(TModule module) { if(module == null || DocumentManagerService == null) return null; IDocument document = DocumentManagerService.FindDocumentByIdOrCreate(module.DocumentType, x => CreateDocument(module)); document.Show(); return document; }
VB.NET
Public Sub Show(ByVal [module] As TModule) ShowCore([module]) End Sub Public Function ShowCore(ByVal [module] As TModule) As IDocument If [module] Is Nothing OrElse DocumentManagerService Is Nothing Then Return Nothing End If Dim document As IDocument = DocumentManagerService.FindDocumentByIdOrCreate([module].DocumentType, Function(x) CreateDocument([module])) document.Show() Return document End Function
因此,您需要做的就是将按钮绑定到这些参数化命令。
C#
var fluentAPI = mvvmContext1.OfType<MyDbContextViewModel>(); fluentAPI.BindCommand(biAccounts, (x, m) => x.Show(m), x => x.Modules[0]); fluentAPI.BindCommand(biCategories, (x, m) => x.Show(m), x => x.Modules[1]); fluentAPI.BindCommand(biTransactions, (x, m) => x.Show(m), x => x.Modules[2]);
VB.NET
Dim fluentAPI = mvvmContext1.OfType(Of MyDbContextViewModel)() fluentAPI.BindCommand(biAccounts, Sub(x, m) x.Show(m), Function(x) x.Modules(0)) fluentAPI.BindCommand(biCategories, Sub(x, m) x.Show(m), Function(x) x.Modules(1)) fluentAPI.BindCommand(biTransactions, Sub(x, m) x.Show(m), Function(x) x.Modules(2))
3. (可选)设置在应用程序加载时最初可见的模块。 为此,请对用户控件的 Load 事件使用 Event-to-Command Behavior。
C#
fluentAPI.WithEvent<EventArgs>(this, "Load") .EventToCommand(x => x.OnLoaded(null), x => x.DefaultModule);
VB.NET
fluentAPI.WithEvent(Of EventArgs)(Me, "Load") .EventToCommand(Function(x) x.OnLoaded(Nothing), Function(x) x.DefaultModule)
默认情况下,DefaultModule 属性返回 Modules 集合的第一项,跳转到属性定义并更改其返回值以将另一个集合项设置为应用程序启动时打开的默认模块。
C#
//Sets the third module, 'Transactions', as the default module public virtual TModule DefaultModule { get { return Modules.ElementAt(2); } }
VB.NET
'Sets the third module, 'Transactions', as the default module Public Overridable ReadOnly Property DefaultModule() As TModule Get Return Modules.ElementAt(2) End Get End Property
4. 启动应用程序来查看当前结果。请注意,单击功能区项目确实会显示空白应用程序模块替代您的视图(参见下图)。
发生这种情况是因为由于 MvvmConxtext 组件,每个 View 都知道其相关的 ViewModel,但 ViewModel 不知道它们在哪些 View 中使用。 要告诉应用程序应该为这个特定模块使用哪个特定视图,请使用 ViewType 属性标记您的视图,此属性将字符串名称作为参数。您的视图名称应该是相关视图模型的名称减去 ‘Model’ ,例如,与“AccountCollectionViewModel”相关的“Accounts”视图应接收“AccountCollectionView”名称,以下代码片段显示了所有三个详细视图所需的代码。
C#
[DevExpress.Utils.MVVM.UI.ViewType("AccountCollectionView")] public partial class AccountsView { // ... } [DevExpress.Utils.MVVM.UI.ViewType("CategoryCollectionView")] public partial class CategoriesView { // ... } [DevExpress.Utils.MVVM.UI.ViewType("TransactionCollectionView")] public partial class TransactionsView { // ... }
VB.NET
<DevExpress.Utils.MVVM.UI.ViewType("AccountCollectionView")> Partial Public Class AccountsView ' ... End Class <DevExpress.Utils.MVVM.UI.ViewType("CategoryCollectionView")> Partial Public Class CategoriesView ' ... End Class <DevExpress.Utils.MVVM.UI.ViewType("TransactionCollectionView")> Partial Public Class TransactionsView ' ... End Class
您可以使用更复杂的方法导航到视图,而无需使用 ViewType 参数。
5. 最后,将详细视图的 RibbonControl 与主视图的功能区合并。 为此,请将 DocumentManager 的 属性设置为 Always。 您还可以将视图中每个 RibbonControl 的 设置为 Always - 无论详细视图是否最大化,这都会合并您的功能区。
您还可以将合并的功能区页面(如果有)设置为父功能区的当前选定页面,为此请将以下代码添加到主视图的代码中。
C#
ribbonControl1.Merge += ribbonControl1_Merge; void ribbonControl1_Merge(object sender, DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs e) { ribbonControl1.SelectPage(e.MergedChild.SelectedPage); }
VB.NET
Private ribbonControl1.Merge += AddressOf ribbonControl1_Merge Private Sub ribbonControl1_Merge(ByVal sender As Object, ByVal e As DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs) ribbonControl1.SelectPage(e.MergedChild.SelectedPage) End Sub
下图说明了结果 - Accounts 模块打开,子功能区合并到主视图的 RibbonControl。
DevExpress WinForm拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!
更多产品正版授权详情及优惠,欢迎咨询
DevExpress技术交流群6:600715373 欢迎一起进群讨论
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:慧都网本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
行业领先的界面控件开发包,帮助企业构建卓越应用!
DevExpress DXperience Subscription高性价比的企业级.NET用户界面套包,助力企业创建卓越应用!
DevExpress WinForms Subscription为Windows Forms平台创建具有影响力的业务解决方案,高性价比WinForms界面控件套包。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢