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

EA插件中EA_OnNotifyContextItemModified无修改触发问题及场景区分咨询

EA插件:EA_OnNotifyContextItemModified无修改触发原因及场景区分方案

为什么未修改内容也会触发EA_OnNotifyContextItemModified?

EA的EA_OnNotifyContextItemModified API设计逻辑并非严格基于实际数据变更触发,而是只要属性窗口的「确定」按钮被点击,就会触发该通知。原因在于EA内部关闭属性窗口时,会执行一系列状态同步操作——比如刷新UI缓存、同步元素的内部状态标记,这些操作会被EA判定为“上下文项已修改”,哪怕用户没有改动任何字段值。

如何区分「无修改点确定」和「修改后点确定」?

核心思路是提前记录元素的原始属性快照,触发通知时对比快照与当前属性值,具体实现步骤如下:

1. 保存元素原始属性快照

在用户打开元素属性窗口前(比如EA_OnContextItemChanged事件,或者捕捉双击元素的操作),记录目标元素的关键属性值,比如名称、描述、 stereotype、备注等可能被修改的字段。

示例C#代码:

// 全局变量存储当前选中元素的原始属性快照
private Dictionary<string, object> _originalElementProps;

public void EA_OnContextItemChanged(EA.Repository repo, string GUID, EA.ObjectType ot)
{
    if (ot == EA.ObjectType.otElement)
    {
        EA.Element element = repo.GetElementByGuid(GUID);
        if (element != null)
        {
            _originalElementProps = new Dictionary<string, object>
            {
                ["Name"] = element.Name,
                ["Notes"] = element.Notes,
                ["Stereotype"] = element.Stereotype,
                // 可根据需求添加更多需要监控的属性
            };
        }
    }
}

2. 触发通知时对比属性值

在EA_OnNotifyContextItemModified事件中,重新获取当前元素的属性,和之前保存的快照逐一对比:

  • 如果存在属性值差异,说明是「修改后点确定」的场景;
  • 如果所有属性值完全一致,说明是「无修改点确定」的场景。

示例C#代码:

public void EA_OnNotifyContextItemModified(EA.Repository repo, string GUID, EA.ObjectType ot)
{
    if (ot == EA.ObjectType.otElement && _originalElementProps != null)
    {
        EA.Element currentElement = repo.GetElementByGuid(GUID);
        bool isActuallyModified = false;

        // 对比名称
        if (!Equals(currentElement.Name, _originalElementProps["Name"]))
        {
            isActuallyModified = true;
        }
        // 对比备注
        else if (!Equals(currentElement.Notes, _originalElementProps["Notes"]))
        {
            isActuallyModified = true;
        }
        // 对比 stereotype
        else if (!Equals(currentElement.Stereotype, _originalElementProps["Stereotype"]))
        {
            isActuallyModified = true;
        }
        // 可继续添加其他属性的对比逻辑

        if (isActuallyModified)
        {
            // 处理「修改内容后点击确定」的逻辑
            Console.WriteLine("元素已实际修改");
        }
        else
        {
            // 处理「未修改内容直接点击确定」的逻辑
            Console.WriteLine("无修改,仅触发窗口关闭同步");
        }

        // 对比完成后清空快照,避免干扰下一次操作
        _originalElementProps = null;
    }
}

注意事项

  • 要确保快照的时效性:如果用户在打开属性窗口前,元素被其他操作修改,需要及时更新快照;
  • EA的元素对象可能存在引用过期问题,对比时务必通过GetElementByGuid重新获取最新实例;
  • 可根据业务需求,调整需要监控的属性列表,覆盖所有可能被用户修改的字段。

内容的提问来源于stack exchange,提问作者Ice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:52:40