在我的自定义DSL的工具,我想在资源管理器中的一个节点,不能被删除。除此之外,我希望它是像一个普通节点。基本上,我想是在DSL资源管理器一样的 XML序列化行为的节点

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

通过使用上的Microsoft.VisualStudio.Modeling.Sdk.DslDefinition.dll装配XmlSerializationDefinitionSerializer类反射我发现,它只是一个DomainClass的衍生物,所以没有什么(显然)特别。

我已经定义了一个DomainClass充当的节点,右键单击它让我添加子节点,只是我希望它的工作,我只是不能摆脱删除菜单选择的方式:

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

我试过什么,我能想到的......我给自己定的属性setter给私人,它就会解决这个问题,我已经设置了多重性为1..1,具有比其他给予无影响错误“验证器”节点丢失时......我看着都为DomainClass和根模型和验证程序域类,其中没有之间的DomainRelationship所有属性似乎处理这个。我也看了在DSL资源管理器窗口中的资源管理器行为节点的一切。我彻底难倒。有谁知道如何做到这一点?

有帮助吗?

解决方案

好了,颇有几分广泛的研究之后,我发现了如何做到这一点。下面是我做什么,如果别人需要的答案,我未来的问题。你必须为你的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 );
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top