You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:15:15