2009-12-16 2 views
1

사용자 정의 DSL 도구에서 탐색기에 제거 할 수없는 노드를 원합니다. 그것 이외에, 나는 그것이 정규 노드처럼되기를 원한다. Microsoft.VisualStudio.Modeling.Sdk.DslDefinition.dll 조립 I의 XmlSerializationDefinitionSerializer 클래스에 리플렉터를 사용을 통해DSL 탐색기의 영구 노드

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

: 기본적으로 내가 원하는 것은 DSL 탐색기에서 XML 직렬화 동작 같은 노드입니다 그것은 단지 DomainClass의 파생물이라는 것을 발견했습니다. 그래서 그것에 대해 특별한 것은 없습니다.

노드로 작동하는 DomainClass를 정의하고이를 마우스 오른쪽 버튼으로 클릭하면 내가 원하는대로 하위 노드를 추가 할 수 있습니다. 삭제 메뉴 선택 항목을 제거 할 수 없습니다.

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

나는 더있다가, 그것이 내가 1..1에 다양성을 설정 한, 그 주위에 도착, 내가 생각할 수있는 ... 나는 개인에 대한 속성 setter를 설정 한 아무것도 시도하지했습니다 "Validators"노드가 없을 때 오류를주는 것 이외의 효과 ... DomainClass와 루트 모델과 Validator Domain 클래스 사이의 DomainRelationship에 대한 모든 속성을 살펴 보았습니다. . 또한 DSL 탐색기 창의 탐색기 동작 노드에서 모든 것을 살펴 보았습니다. 나는 완전히 비틀 거린다. 아무도 이것을하는 방법을 아는가?

답변

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); 
     } 
    } 
} 
+0

일을. 잘 했어. DSL 도구와 그 질문에 대한 답변을 좋아합니다. –