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
相关产品推荐
相关产品推荐

