在DSL资源管理器中永久节点
-
19-09-2019 - |
题
在我的自定义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 );
}
}
}