Постоянный узел в проводнике DSL - PullRequest
1 голос
/ 16 декабря 2009

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

Иллюстрация контекстного меню поведения сериализации Xml http://img31.imageshack.us/img31/740/xmlserializerbehavior.png

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

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

Удалить иллюстрацию элемента контекстного меню http://img705.imageshack.us/img705/9033/validators.png

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

1 Ответ

1 голос
/ 17 декабря 2009

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