1

私のカスタム DSL ツールでは、削除できないノードが Explorer に必要です。それ以外は、通常のノードのようにしたいです。基本的に私が欲しいのは、DSL ExplorerのXml Serialization Behaviorのようなノードです:

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

考えられることは何でも試しました...プロパティセッターをプライベートに設定しました。それを回避し、多重度を1..1に設定しました。 「Validators」ノードがありません... DomainClass と、ルート モデルと Validators Domain Class の間の DomainRelationship の両方のすべてのプロパティを調べましたが、どれもこれに対処していないようです。また、DSL Explorer ウィンドウの Explorer Behavior ノードのすべてを調べました。私は完全に困惑しています。誰もこれを行う方法を知っていますか?

4

1 に答える 1

1

さて、かなりの広範な調査の後、私はこれを行う方法を見つけました。将来誰かが私の質問に対する答えを必要とする場合に備えて、私がしたことは次のとおりです。DSL モデルの DesignerExplorer (ModelExplorer.tt ファイルによって作成された DslPackage プロジェクトにあります) の部分クラスを作成し、次のコードを配置する必要があります。

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 に答える