XAF框架保存操作触发条件验证与确认弹窗实现方案咨询
解决方案:拦截XAF保存/确认动作并动态弹出确认对话框
1. 自定义控制器拦截主表单保存动作
创建一个针对详情视图的ViewController,获取框架内置的ModificationsController,拦截保存、保存并新建、保存并关闭三个动作的执行事件,实现动态条件检查与确认弹窗:
using DevExpress.ExpressApp; using DevExpress.ExpressApp.Actions; using DevExpress.ExpressApp.SystemModule; using DevExpress.XtraEditors; public class SaveConfirmationController : ViewController<DetailView> { private ModificationsController _modificationsController; protected override void OnActivated() { base.OnActivated(); _modificationsController = Frame.GetController<ModificationsController>(); if (_modificationsController == null) return; // 绑定所有保存类动作的执行事件 _modificationsController.SaveAction.Execute += OnSaveActionExecute; _modificationsController.SaveAndNewAction.Execute += OnSaveActionExecute; _modificationsController.SaveAndCloseAction.Execute += OnSaveActionExecute; } private void OnSaveActionExecute(object sender, SimpleActionExecuteEventArgs e) { var targetObj = View.CurrentObject as YourBusinessModel; if (targetObj == null) return; // 替换为你的实际检查条件 if (targetObj.IsHighRisk) { // 弹出确认对话框 var confirmResult = XtraMessageBox.Show( "当前对象为高风险状态,确认要保存吗?", "保存确认", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Warning); if (confirmResult != System.Windows.Forms.DialogResult.Yes) { // 用户取消,终止保存动作 e.Cancel = true; return; } // 确认后执行自定义逻辑 RunPostConfirmLogic(targetObj); } } private void RunPostConfirmLogic(YourBusinessModel model) { // 此处编写确认后的处理逻辑,比如记录操作日志、更新关联数据等 model.ConfirmedSaveTime = DateTime.Now; } protected override void OnDeactivated() { if (_modificationsController == null) return; // 取消事件绑定,避免内存泄漏 _modificationsController.SaveAction.Execute -= OnSaveActionExecute; _modificationsController.SaveAndNewAction.Execute -= OnSaveActionExecute; _modificationsController.SaveAndCloseAction.Execute -= OnSaveActionExecute; base.OnDeactivated(); } }
2. 处理弹窗详情视图的确定按钮
针对弹窗式详情视图(如通过PopupWindowShowAction打开的窗口),需要额外拦截DialogController的确定动作:
在上述控制器中补充以下代码:
private DialogController _dialogController; protected override void OnActivated() { base.OnActivated(); // ... 原有ModificationsController绑定代码 _dialogController = Frame.GetController<DialogController>(); if (_dialogController != null) { _dialogController.AcceptAction.Execute += OnDialogAcceptExecute; } } private void OnDialogAcceptExecute(object sender, SimpleActionExecuteEventArgs e) { var targetObj = View.CurrentObject as YourBusinessModel; if (targetObj == null || !targetObj.IsHighRisk) return; var confirmResult = XtraMessageBox.Show( "当前对象为高风险状态,确认要执行此操作吗?", "操作确认", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Warning); if (confirmResult != System.Windows.Forms.DialogResult.Yes) { e.Cancel = true; return; } RunPostConfirmLogic(targetObj); } protected override void OnDeactivated() { // ... 原有ModificationsController解绑代码 if (_dialogController != null) { _dialogController.AcceptAction.Execute -= OnDialogAcceptExecute; } base.OnDeactivated(); }
3. Web项目适配说明
如果是XAF Web项目,需替换XtraMessageBox为Web端专用的确认方法:
var confirmResult = WebWindow.ShowConfirm("当前对象为高风险状态,确认要保存吗?"); if (!confirmResult) { e.Cancel = true; return; }
核心注意点
- 替换代码中的
YourBusinessModel为实际业务对象类名,IsHighRisk为你需要检查的属性条件。 - 该方案支持动态判断条件,只有符合规则时才触发确认弹窗,解决了
ConfirmationMessage静态文本无法动态控制的问题。 - 必须在
OnDeactivated中取消事件绑定,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Batool Zain
相关产品推荐
相关产品推荐

