1

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

Xml 序列化行为上下文菜单插图 http://img31.imageshack.us/img31/740/xmlserializerbehavior.png

通过在 Microsoft.VisualStudio.Modeling.Sdk.DslDefinition.dll 程序集中的 XmlSerializationDefinitionSerializer 类上使用 Reflector,我发现它只是 DomainClass 的派生类,因此(显然)没有什么特别之处。

我已经定义了一个用作节点的 DomainClass,右键单击它可以让我按照我想要的方式添加子节点,我就是无法摆脱删除菜单选项:

删除上下文菜单项插图 http://img705.imageshack.us/img705/9033/validators.png

我已经尝试了任何我能想到的... “验证器”节点丢失...我查看了 DomainClass 和根模型与验证器域类之间的 DomainRelationship 的所有属性,但似乎没有一个可以处理这个问题。我还查看了 DSL Explorer 窗口中 Explorer Behavior 节点中的所有内容。我完全被难住了。有人知道怎么做这个吗?

4

1 回答 1

1

好的,经过相当多的广泛研究,我发现了如何做到这一点。这就是我所做的,以防其他人将来需要我的问题的答案。您必须为您的 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 );
        }
    }
}
于 2009-12-16T22:15:04.610 回答