代码之家  ›  专栏  ›  技术社区  ›  Alex

DSL资源管理器中的永久节点

  •  1
  • Alex  · 技术社区  · 16 年前

    在我的自定义DSL工具中,我希望在其资源管理器中有一个无法删除的节点。除此之外,我希望它像常规节点一样。基本上我想要的是一个像 XML序列化行为 在DSL资源管理器中:

    Xml Serialization Behavior context menu illustration http://img31.imageshack.us/img31/740/xmlserializerbehavior.png

    通过在Microsoft.VisualStudio.Modeling.sdk.dsldefinition.dll程序集中的XmlSerializationDefinitionSerializer类上使用Reflector,我发现它只是DomainClass的一个派生,因此没有(显然)特别的地方。

    我已经定义了一个作为节点工作的域类,右键单击它可以让我按照我希望的方式添加子节点,但我无法摆脱删除菜单选项:

    Delete context menu item illustration http://img705.imageshack.us/img705/9033/validators.png

    我尝试过任何我能想到的…我已经将属性设置器设置为private,它解决了这个问题,我将重数设置为1..1,除了在缺少“validators”节点时出错之外,它没有任何效果…我已经查看了DomainClass和根模型和验证程序域类之间的DomainRelationship的所有属性,但没有一个属性可以处理这个问题。我还查看了DSL资源管理器窗口中资源管理器行为节点中的所有内容。我受够了。有人知道怎么做吗?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Alex    16 年前

    好吧,经过一番广泛的研究,我发现了如何做到这一点。以下是我所做的,以防将来有人需要我的问题的答案。必须为DSL模型的DesignerExplorer(它在DSLPackage项目中,由modelexplorer.tt文件创建)创建分部类,并在其中输入以下代码:

    internal partial class MyDesignerExplorer
    {
        /// <summary>
        /// Override to stop the "Delete" command appearing for
        /// Validators.
        /// </summary>
        protected override void ProcessOnStatusDeleteCommand( MenuCommand command )
        {
            // Check the selected items to see if they contain
            // Validators.
            if( this.SelectedElement.GetType()== typeof( Validators ) ) 
            {
                // Disable the menu command
                command.Enabled = false;
                command.Visible = false;
            }
            else
            {
                // Otherwise, delegate to the base method.
                base.ProcessOnStatusDeleteCommand( command );
            }
        }
    }
    
    推荐文章