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

如何在M-driven中为ViewModel创建状态机选择列表?

实现状态机作为ViewModel选择列表的方案

核心思路

要把状态机的状态转换成ViewModel可识别的选择项,关键是通过OCL正确获取状态集合,并将状态的名称/标识转为选择列表需要的字符串格式。你之前的表达式方向正确,但需要调整语法和逻辑。

具体实现步骤

1. 建立ViewModel与状态机的关联

先确认你的ViewModel对象已通过属性(比如stateMachine)正确引用目标状态机实例。如果没有这个关联,先在模型里建立引用,后续OCL才能正常获取状态数据。

2. 修正OCL表达式获取状态列表

替换你之前的表达式,根据需求选以下两种方式:

  • 仅获取状态名称作为选项文本:
    适合只需要显示状态名称的场景,表达式如下:

    self.stateMachine.allOwnedStates()->collect(s | s.name)
    

    解释:allOwnedStates()会递归获取状态机下所有嵌套状态,collect(s | s.name)将每个状态的名称提取为字符串集合,直接作为选择列表的选项值。如果只需要顶层状态,把allOwnedStates()换成ownedStates()即可。

  • 获取带标识的状态名称:
    若需要同时保留状态的唯一标识(比如ID),方便后续绑定状态实例,可使用:

    self.stateMachine.allOwnedStates()->collect(s | s.name + " (" + s.id + ")")
    

    这里假设状态有id属性,可根据你的模型实际字段调整。

3. 在ViewModel中配置选择列表

将上述OCL表达式配置到ViewModel选择列表的「选项来源」(或对应工具中的同类配置项):

  • 比如在Enterprise Architect中,找到ViewModel的目标属性,设置下拉列表类型为「OCL查询」,粘贴表达式。
  • 若基于EMF框架(如Sirius/GMF),在选择列表的choices属性中绑定该OCL表达式。

4. 调试与适配

  • 如果返回状态为空,检查stateMachine引用是否指向正确的状态机实例,确认状态机已创建并包含状态。
  • 若不需要递归获取子状态,替换allOwnedStates()为ownedStates()即可只获取顶层状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:29:52