Windows Forms 기반 도메인별 언어 만들기

DSL 다이어그램을 사용하는 대신 도메인 관련 언어 (DSL) 모델의 상태를 표시하려면 Windows Forms을 사용할 수 있습니다.이 토픽은 Visual Studio 시각화와 모델링 SDK를 이용하여, Windows Form을 DSL에 결합하도록 합니다.

Windows Form UI 및 모델 탐색기를 표시하는 DSL 인스턴스입니다.

DSL-Wpf-2

Windows Forms DSL 만들기

최소 WinForm 디자이너 DSL 템플릿은 사용자 고유의 요구 사항에 맞게 수정할 수 있는 최소한의 DSL을 만듭니다.

최소 WinForms DSL을 만들려면

  1. 최소 WinForm 디자이너 템플릿에서 DSL을 만듭니다.

    이 연습에서는 다음 이름이 가정됩니다.

    솔루션 및 DSL 이름

    FarmApp

    Namespace

    Company.FarmApp

  2. 템플릿이 제공하는 초기 예제를 살펴 봅니다.

    1. 모든 템플릿을 변환합니다.

    2. 샘플을 빌드하여 실행합니다(CTRL+F5).

    3. 실험 모드의 Visual Studio 인스턴스에서 디버깅 프로젝트에 있는 Sample 파일을 엽니다.

      Windows Forms 컨트롤에서 표시 된 것을 확인할 수 있습니다.

      탐색기에 표시되는 모델의 요소를 확인할 수도 있습니다.

      폼 또는 탐색기에 일부 요소를 추가하고 다른 표시에 나타난다고 알립니다.

의 주 인스턴스에서 DSL 솔루션에 대한 다음 사항을 확인합니다.

  • DslDefinition.dsl에 다이어그램 요소가 없습니다.이것은 이 DSL의 인스턴스 모델을 보기 위하여 DSL 다이어그램을 사용하지 않기 때문입니다.대신, Windows Form을 모델에 바인딩하면 폼의 요소가 모델에 표시됩니다.

  • Dsl 및 DslPackage 프로젝트 이외에, 이 솔루션에는 UI.라는 세 번째 프로젝트가 포함됩니다. UI 프로젝트에는 Windows Forms 컨트롤의 정의가 포함됩니다.DslPackage는 UI에 종속되고, UI는 Dsl에 종속됩니다.

  • DslPackage 프로젝트에서, UI\DocView.cs에는 UI 프로젝트에 정의된 Windows Forms 컨트롤을 표시하는 코드가 포함되어 있습니다.

  • UI 프로젝트에는 DSL에 바인딩된 폼 컨트롤 작업 샘플에 포함되어 있습니다.하지만 DSL 정의를 변경한 경우 작동하지 않습니다.UI 프로젝트는 다음을 포함합니다.

    • ModelViewControl이라는 Windows Forms 클래스입니다.

    • ModelViewControl의 추가 부분 정의를 포함하는 DataBinding.cs라는 파일입니다.Solution Explorer에서 내용을 보려면, 파일을 위한 단축 메뉴를 열어서 View Code를 선택해야 합니다.

Dd820642.collapse_all(ko-kr,VS.110).gifUI 프로젝트 정보

DSL을 정의하기 위하여 DSL 정의를 업데이트 할 경우, DSL을 나타내기 위하여 UI 프로젝트에서 제어를 업데이트해야 합니다.Dsl 및 DslPackage 프로젝트와는 달리 UI 샘플 프로젝트는 DslDefinitionl.dsl에서 생성되지 않습니다.이 연습에서 다루지는 않지만, 원하는 경우 코드를 생성 하려면.tt 파일을 추가할 수 있습니다.

DSL 정의 업데이트

다음 DSL 정의가 연습에서 사용됩니다.

DSL-Wpf-1

DSL 정의를 업데이트하려면

  1. DSL 디자이너에서 Dsldefinition.dsl를 엽니다.

  2. ExampleElement 삭제

  3. Farm에서 ExampleModel 도메인 클래스에 이름을 바꿉니다.

    형식이 Int32인 Size와 형식이 Boolean인 IsOrganic이라고 명명된 추가 도메인 속성을 제공합니다.

    [!참고]

    루트 도메인 클래스를 삭제한 다음 새 루트를 만드는 경우 편집기 루트 클래스 속성을 다시 설정 해야 합니다.DSL 탐색기에서 편집기를 선택합니다.그런 다음 속성 창에서 루트 클래스를 Farm으로 설정합니다.

  4. 도메인 클래스 도구를 사용하여 다음과 같은 도메인 클래스를 만들 수 있습니다.

    • Field – 여기에 이름이 Size인 추가 도메인 속성을 제공합니다.

    • Animal – 속성 창에서 상속 한정자추상으로 설정합니다.

  5. 도메인 클래스 도구를 사용하여 다음과 같은 클래스를 만들 수 있습니다.

    • Goat

  6. 상속 도구를 사용하여 동물에서 상속한 염소 및 양을 만듭니다.

  7. 포함 도구를 사용하여 팜 아래에 필드 및 동물을 포함합니다.

  8. 다음과 같은 다이어그램을 해볼 수도 있습니다.중복 요소의 개수를 감소시키기 위하여, 리프 요소의 단축 메뉴에 관한 Bring Subtree Here 명령어를 사용해야 합니다.

  9. 솔루션 탐색기 도구 모음의 모든 템플릿 변환.

  10. Dsl 프로젝트를 빌드합니다.

    [!참고]

    이 단계에서 다른 프로젝트는 오류 없이 빌드되지 않습니다.하지만 Dsl 프로젝트를 빌드해서 해당 어셈블리를 데이터 소스 마법사에서 사용하려고 합니다.

UI 프로젝트 업데이트

이제 DSL 모델에 저장된 정보를 표시할 새로운 사용자 정의 컨트롤을 만들 수 있습니다.데이터 바인딩을 통해 사용자 컨트롤을 모델에 가장 쉽게 연결할 수 있습니다.ModelingBindingSource라고 명명된 데이터 바인딩 어댑터 형식은 비VMSDK 인터페이스에 DSL 연결하기 위해 특별히 설계되었습니다.

DSL 모델을 데이터 소스로 정의하려면

  1. 데이터 메뉴에서 데이터 소스 표시를 선택합니다.

    데이터 소스 창이 열립니다.

    새 데이터 소스 추가를 선택합니다.데이터 소스 구성 마법사가 열립니다.

  2. 개체, 다음을 선택합니다.

    Dsl, Company.FarmApp를 확장하고 모델의 루트 클래스인 Farm을 선택합니다.마침을 선택합니다.

    솔루션 탐색기에서 현재 UI 프로젝트에 Properties\DataSources\Farm.datasource가 포함되어 있습니다.

    모델 클래스의 속성 및 관계는 데이터 소스 창에 나타납니다.

    DslWpf-3

모델을 폼에 연결하려면

  1. UI 프로젝트에서 기존 .cs 파일을 모두 삭제합니다.

  2. FarmControl이라는 이름의 새 사용자 정의 컨트롤 파일을 UI 프로젝트에 추가합니다.

  3. 데이터 소스 창에 있는 의 드롭다운 메뉴에서 세부 정보를 선택합니다.

    다른 속성의 경우는 기본 설정을 그대로 둡니다.

  4. 디자인 뷰에서 FarmControl.cs을 엽니다.

    을 데이터 소스 창에서 FarmControl로 끌어서 놓습니다.

    컨트롤 집합이 속성마다 하나씩 나타납니다.관계 속성은 컨트롤을 생성하지 않습니다.

  5. farmBindingNavigator를 삭제합니다.이것은 또한 FarmControl 디자이너에서 자동으로 생성되지만 이 응용 프로그램에는 유용하지 않습니다.

  6. 도구 상자를 사용하여 DataGridView의 두 인스턴스를 만들고 AnimalGridView 및 FieldGridView로 부릅니다.

    [!참고]

    다른 방법은 Animals 및 Fields 항목을 데이터 소스 창에서 컨트롤로 끌어오는 것입니다.이 작업은 데이터 표와 표 뷰와 데이터 소스 사이의 바인딩을 자동으로 만듭니다.하지만 이 바인딩은 DSL에 올바르게 작동하지 않습니다.따라서 수동으로 데이터 격자를 만들고 바인딩하는 것이 좋습니다.

  7. 도구 상자에 ModelingBindingSource 도구가 없을 경우 추가합니다.데이터 탭의 바로 가기 메뉴에서 항목 선택을 선택합니다.도구 상자 항목 선택 대화 상자의 .NET Framework 탭에서 ModelingBindingSource를 선택합니다.

  8. 도구 상자를 사용하여 ModelingBindingSource의 두 인스턴스를 만들고 AnimalBinding 및 FieldBinding으로 부릅니다.

  9. ModelingBindingSourceDataSource 속성을 farmBindingSource로 설정합니다.

    DataMember 속성을 동물 또는 필드로 설정합니다.

  10. AnimalGridView의 DataSource 속성을 AnimalBinding으로 FieldGridView의 DataSource 속성을 FieldBinding으로 설정합니다.

  11. 팜 컨트롤의 레이아웃을 원하는 대로 조정합니다.

ModelingBindingSource는 DSL에 관련된 몇 가지 함수를 수행하는 어댑터입니다.

  • VMSDK 저장소 트랜잭션에서 업데이트를 래핑합니다.

    예를 들어, 사용자가 데이터 뷰 표 형태에서 행을 삭제하는 경우 일반 바인딩에서는 트랜잭션 예외가 발생합니다.

  • 사용자가 행을 선택하면 속성 창은 데이터 표 행 대신 해당 모델 요소의 속성을 표시합니다.

데이터 소스와 뷰 간의 연결 스키마입니다.

DslWpf4

DSL에 바인딩을 완료하려면

  1. UI 프로젝트의 별도의 코드 파일에서 다음 코드를 추가합니다.

    using System.ComponentModel;
    using Microsoft.VisualStudio.Modeling;
    using Microsoft.VisualStudio.Modeling.Design;
    
    namespace Company.FarmApp
    {
      partial class FarmControl
      {
        public IContainer Components { get { return components; } }
    
        /// <summary>Binds the WinForms data source to the DSL model.
        /// </summary>
        /// <param name="nodelRoot">The root element of the model.</param>
        public void DataBind(ModelElement modelRoot)
        {
          WinFormsDataBindingHelper.PreInitializeDataSources(this);
          this.farmBindingSource.DataSource = modelRoot;
          WinFormsDataBindingHelper.InitializeDataSources(this);
        }
      }
    }
    
  2. DslPackage 프로젝트에서 DslPackage\DocView.tt를 편집하여 다음 변수 정의를 업데이트합니다.

    string viewControlTypeName = "FarmControl";
    

DSL 테스트

개선 사항을 나중에 추가할 수 있지만 이제 DSL 솔루션 빌드하고 실행할 수 있습니다.

DSL을 테스트하려면

  1. 솔루션을 빌드하고 실행합니다.

  2. Visual Studio의 실험 인스턴스에서 샘플 파일을 엽니다.

  3. @@FarmApp 탐색기에서 @@팜 루트 노드의 바로 가기 메뉴를 열고 @@새 염소 추가를 선택합니다.

    Goat1이 Animals 뷰에 표시됩니다.

    주의 정보주의

    동물 노드가 아닌 노드에 있는 바로 가기 메뉴를 사용해야 합니다.

  4. 루트 노드를 선택하고 해당 속성을 봅니다.

    폼 뷰에서 폼의 이름 또는 크기를 변경합니다.

    양식에 있는 각 필드로부터 멀리 탐색할 때, 해당 속성은 속성 창에서 변경됩니다.

DSL 개선

속성을 바로 업데이트하려면

  1. FarmControl.cs의 디자인 뷰에서 이름, 크기 또는 IsOrganic와 같은 간단한 필드를 선택합니다.

  2. 속성 창에서 DataBindings을 확장하고 **(고급)**을 엽니다.

    Formatting and Advanced Binding 대화 상자의 Data Source Update Mode에서 OnPropertyChanged를 선택합니다.

  3. 솔루션을 빌드하고 실행합니다.

    필드의 내용을 변경 하는 경우 팜 모델 해당 속성이 변경되는 즉시 확인하십시오.

추가 단추를 제공하려면

  1. FarmControl.cs의 디자인 뷰에서 도구 상자를 사용하여 팜에 단추를 만듭니다.

    단추의 이름과 텍스트를 예를 들어 New Sheep으로 편집합니다.

  2. 단추 뒤에 코드를 엽니다(예를 들면 더블 클릭하여).

    다음과 같이 편집합니다.

        private void NewSheepButton_Click(object sender, EventArgs e)
        {
          using (Transaction t = farm.Store.TransactionManager.BeginTransaction("Add sheep"))
          {
            elementOperations.MergeElementGroup(farm,
              new ElementGroup(new Sheep(farm.Partition)));
            t.Commit();
          }
        }
    
        // The following code is shared with other add buttons:
        private ElementOperations operationsCache = null;
        private ElementOperations elementOperations
        {
          get
          {
            if (operationsCache == null)
            {
              operationsCache = new ElementOperations(farm.Store, farm.Partition);
            }
            return operationsCache;
          }
        }
        private Farm farm
        {
          get { return this.farmBindingSource.DataSource as Farm; }
        }
    

    또한 다음 지시문을 입력해야 합니다.

    using Microsoft.VisualStudio.Modeling;
    
  3. 염소 및 필드에 대한 유사한 단추를 추가합니다.

  4. 솔루션을 빌드하고 실행합니다.

  5. 확인 단추는 새 항목을 추가합니다.새 항목은 FarmApp 탐색기 및 해당 데이터 표 뷰에 모두 나타나야 합니다.

    데이터 표 뷰에서 요소의 이름을 편집할 수 있습니다.거기서도 삭제할 수 있습니다.

DSL-Wpf-2

Dd820642.collapse_all(ko-kr,VS.110).gif요소를 추가하는 코드 정보

새 요소 단추의 경우 다음 대체 코드가 조금 더 간단합니다.

    private void NewSheepButton_Click(object sender, EventArgs e)
    {
      using (Transaction t = farm.Store.TransactionManager.BeginTransaction("Add sheep"))
      {
        farm.Animals.Add(new Sheep(farm.Partition)); ;
        t.Commit();
      }
    }

하지만 이 코드는 새 항목의 기본 이름을 설정하지 않습니다.DSL의 요소 병합 지시문에 정의한 모든 사용자 지정 병합을 실행하지 않으며, 정의한 모든 사용자 지정 병합 코드를 실행하지 않습니다.

따라서 ElementOperations를 사용하여 새 요소를 만드는 것이 좋습니다.자세한 내용은 요소 만들기 및 이동 사용자 지정을 참조하십시오.

참고 항목

개념

도메인별 언어 정의 방법

시각화 및 모델링 SDK - 도메인별 언어

기타 리소스

도메인별 언어를 사용자 지정하는 코드 작성