XAF-如何改变列表点击时的默认行为
在 Windows 窗体应用程序中,按下回车或双击列表会打开默认的详细视图。
在 ASP.NET Web 应用程序中,单击对象时执行此操作。
这一行为是由 ListViewProcessCurrentObjectController 的 ListViewProcessCurrentObjectController.ProcessCurrentObjectAction 按钮所定义的。
可以将此操作替换为自定义的简单操作。下面演示如何执行此操作。
有下面的BO定义,地址记录。
[DefaultClassOptions, ImageName("BO_Contact")] public class AddressBookRecord : BaseObject { public AddressBookRecord(Session session) : base(session) { } private string name; public string Name { get { return name; } set { SetPropertyValue("Name", ref name, value); } } private string email; public string Email { get { return email; } set { SetPropertyValue("Email", ref email, value); } } private string phoneNumber; public string PhoneNumber { get { return phoneNumber; } set { SetPropertyValue("PhoneNumber", ref phoneNumber, value); } } }
现在并为AddressBookRecord 对象操作加一个WriteMailController,并填加 WriteMail Action。这个操作将调用与最终用户的计算机上的 MailTo 协议相关联的程序。说白了就是发个邮件,调用邮件客户端。
using System.Diagnostics; // ... public class WriteMailController : ViewController { private SimpleAction writeMailAction; public WriteMailController() { TargetObjectType = typeof(AddressBookRecord); writeMailAction = new SimpleAction(this, "WriteMail", PredefinedCategory.Edit); writeMailAction.ToolTip = "Write e-mail to the selected address book record"; writeMailAction.SelectionDependencyType = SelectionDependencyType.RequireSingleObject; writeMailAction.ImageName = "BO_Contact"; writeMailAction.Execute += writeMailAction_Execute; } void writeMailAction_Execute(object sender, SimpleActionExecuteEventArgs e) { AddressBookRecord record = (AddressBookRecord)e.CurrentObject; string startInfo = String.Format( "mailto:{0}?body=Hello, {1}!%0A%0A", record.Email, record.Name); Process.Start(startInfo); } }
默认情况下,只有选中了列表中的一条记录后,再点击上面我们填加的按钮,才会执行调用邮件客户端的动作。
下面,我们演示,在win中双击列表,即执行上面的动作。
using DevExpress.ExpressApp.SystemModule; // ... public class WriteMailController : ViewController { // ... private ListViewProcessCurrentObjectController processCurrentObjectController; protected override void OnActivated() { base.OnActivated(); processCurrentObjectController = Frame.GetController<ListViewProcessCurrentObjectController>(); if (processCurrentObjectController != null) { processCurrentObjectController.CustomProcessSelectedItem += processCurrentObjectController_CustomProcessSelectedItem; } } private void processCurrentObjectController_CustomProcessSelectedItem(object sender, CustomProcessListViewSelectedItemEventArgs e) { e.Handled = true; writeMailAction.DoExecute(); } protected override void OnDeactivated() { if (processCurrentObjectController != null) { processCurrentObjectController.CustomProcessSelectedItem -= processCurrentObjectController_CustomProcessSelectedItem; } base.OnDeactivated(); } }
下面是效果:
这时你会发现,你没办法修改记录了,即详细视图没办法显示出来了。下面代码来解决这样的问题,即,加个控制器,实现这些功能。
using DevExpress.ExpressApp.SystemModule; // ... public class EditAddressBookRecordController : ViewController<ListView> { public EditAddressBookRecordController() { TargetObjectType = typeof(AddressBookRecord); SimpleAction editAddressBookRecordAction = new SimpleAction(this, "EditAddressBookRecord", PredefinedCategory.Edit); editAddressBookRecordAction.ImageName = "Action_Edit"; editAddressBookRecordAction.SelectionDependencyType = SelectionDependencyType.RequireSingleObject; editAddressBookRecordAction.Execute += editAddressBookRecordAction_Execute; } void editAddressBookRecordAction_Execute(object sender, SimpleActionExecuteEventArgs e) { ListViewProcessCurrentObjectController.ShowObject( e.CurrentObject, e.ShowViewParameters, Application, Frame, View); } }
注意:在web中没这个问题,所以不用管。
XAF开发成品案例参考
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
作者博客: http://www.cnblogs.com/foreachlife
欢迎加入CIIP框架\XAF技术应用交流群: 336090194 群文件中有更多相关工具及文档资料
转载请注明出处。多谢!
欢迎加我微信: admiralcn 或扫码:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端