2009-12-16 6 views
1

В моем пользовательском инструменте DSL я хочу, чтобы в его проводнике был удален узел, который нельзя удалить. Кроме этого, я хочу, чтобы он был как обычный узел. В основном то, что я хочу, это узел, как Xml сериализации поведения в DSL Explorer:Постоянный узел в проводнике DSL

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

Через использование отражателя на классе XmlSerializationDefinitionSerializer в сборочном I Microsoft.VisualStudio.Modeling.Sdk.DslDefinition.dll «Я обнаружил, что это просто производная от DomainClass, поэтому нет ничего (явно) особого.

я определил DomainClass, который функционирует как узел, и правая кнопка мыши это позволяет мне добавить подузлы именно так, как я хочу работать, я просто не могу избавиться от этого выбора меню Delete:

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

Я пробовал все, что я могу думать ... Я установить свойство сеттер в частном порядке, он получает около того, я установил кратность в 1..1, что не имеет эффект, отличный от дачи ошибок, когда узел «Validators» отсутствует ... Я просмотрел все свойства как для DomainClass, так и для DomainRelationship между корневой моделью и классом Domain Validators, и ни один из них, похоже, не справляется с этим , Я также просмотрел все в узле Explorer Explorer в окне DSL Explorer. Я полностью в тупике. Кто-нибудь знает, как это сделать?

ответ

1

Хорошо, после довольно обширного исследования я узнал, как это сделать. Вот что я сделал, если кому-то еще понадобится ответ на мой вопрос в будущем. Вы должны создать частичный класс для DesignerExplorer вашего DSL модели (это в проекте 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); 
     } 
    } 
} 
+0

+1. Красиво сделано. Мне нравятся инструменты DSL и все хорошо, что вы ответили на вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^