Sdílet prostřednictvím


Vytvoření jazyka specifického pro doménu založeného na model Windows Forms

Pomocí model Windows Forms můžete místo diagramu DSL zobrazit stav modelu jazyka specifického pro doménu (DSL). Toto téma vás provede vazbou formuláře Windows Form na DSL pomocí sady Visual Studio Visualization and Modeling SDK.

Následující obrázek ukazuje uživatelské rozhraní formuláře Windows a průzkumníka modelů pro instanci DSL:

DSL instance in Visual Studio

Vytvoření model Windows Forms DSL

Šablona DSL minimálního návrháře WinForm Designer vytvoří minimální DSL, kterou můžete upravit tak, aby vyhovovala vašim vlastním požadavkům.

  1. Vytvořte DSL z minimální šablony Návrháře WinForm.

    V tomto názorném postupu se předpokládají následující názvy:

    • Název řešení a DSL: FarmApp
    • Obor názvů: Company.FarmApp
  2. Experimentujte s počátečním příkladem, který šablona poskytuje:

    1. Transformovat všechny šablony

    2. Sestavte a spusťte ukázku (Ctrl+F5).

    3. V experimentální instanci sady Visual Studio otevřete Sample soubor v projektu ladění.

      Všimněte si, že se zobrazuje v ovládacím prvku model Windows Forms.

      Můžete také zobrazit prvky modelu zobrazené v Průzkumníku.

      Přidejte některé prvky ve formuláři nebo Průzkumníku a všimněte si, že se zobrazují na druhém displeji.

    V hlavní instanci sady Visual Studio si všimněte následujících bodů o řešení DSL:

  • DslDefinition.dsl neobsahuje žádné prvky diagramu. Je to proto, že nebudete používat diagramy DSL k zobrazení modelů instancí této DSL. Místo toho vytvoříte vazbu formuláře Windows s modelem a prvky ve formuláři zobrazí model.

  • Kromě Dsl projektů a DslPackage projektů obsahuje řešení třetí projekt s názvem UI.UI obsahuje definici ovládacího prvku model Windows Forms. DslPackagezávisí na , a UI závisí na DslUI.

  • DslPackage V projektu obsahuje kód, UI\DocView.cs který zobrazuje ovládací prvek model Windows Forms definovaný v UI projektu.

  • Projekt UI obsahuje funkční vzorek ovládacího prvku formuláře vázaného na DSL. Nebude však fungovat, pokud jste změnili definici DSL. Projekt UI obsahuje:

    • Třída model Windows Forms s názvem ModelViewControl.

    • Soubor s názvem DataBinding.cs , který obsahuje další částečnou definici ModelViewControl. Pokud chcete zobrazit jeho obsah, otevřete v Průzkumník řešení místní nabídku souboru a zvolte Zobrazit kód.

Informace o projektu uživatelského rozhraní

Když aktualizujete definiční soubor DSL tak, aby definoval vlastní DSL, budete muset aktualizovat ovládací prvek v UI projektu pro zobrazení DSL. Dsl Na rozdíl od projektů a DslPackage projektů se z ukázkového UI projektu nevygeneruje DslDefinitionl.dsl. Pokud chcete kód vygenerovat, můžete přidat soubory .tt, i když to není popsané v tomto návodu.

Aktualizace definice DSL

Následující obrázek je definice DSL použitá v tomto návodu.

DSL definition

  1. Otevřete DslDefinition.dsl v návrháři DSL.

  2. Odstranit ExampleElement

  3. Přejmenujte třídu domény ExampleModel na Farm.

    Zadejte další vlastnosti domény s názvem Size typu Int32 a IsOrganic typu Boolean.

    Poznámka:

    Pokud odstraníte kořenovou třídu domény a pak vytvoříte nový kořen, budete muset resetovat vlastnost Root Class editoru. V Průzkumníku DSL vyberte Editor. Potom v okno Vlastnosti nastavte kořenovou třídu na Farm.

  4. Pomocí nástroje Pojmenovaná třída domény vytvořte následující třídy domény:

    • Field - Zadejte další vlastnost domény s názvem Size.

    • Animal- V okno Vlastnosti nastavte modifikátor dědičnosti na abstraktní.

    Poznámka:

    Nástroj Pojmenovaná třída domény a další nástroje uvedené v této části najdete v okně nástrojů panelu nástrojů . Toto okno můžete otevřít nebo skrýt pomocí panelu nástrojů Zobrazení>.

  5. Pomocí nástroje Domain Class vytvořte následující třídy:

    • Sheep

    • Goat

  6. Pomocí nástroje Dědičnost vytvořit Goat a Sheep dědit z Animal.

  7. Pomocí nástroje Embedding vložte Field a Animal v části Farm.

  8. Možná budete chtít diagram vázat. Chcete-li snížit počet duplicitních prvků, použijte příkaz Bring Subtree Here v místní nabídce prvků typu list.

  9. Transformovat všechny šablony na panelu nástrojů Průzkumník řešení

  10. Sestavte projekt Dsl.

    Poznámka:

    V této fázi ostatní projekty nebudou sestavovat bez chyb. Chceme však sestavit projekt Dsl tak, aby jeho sestavení bylo k dispozici v Průvodci zdrojem dat.

Aktualizace projektu uživatelského rozhraní

Teď můžete vytvořit nový uživatelský ovládací prvek, který zobrazí informace uložené v modelu DSL. Nejjednodušší způsob, jak propojit uživatelský ovládací prvek s modelem, je prostřednictvím datových vazeb. Typ adaptéru datové vazby s názvem ModelingBindingSource je speciálně navržený pro připojení seznamů DSLs k rozhraním jiných než VMSDK.

Definování modelu DSL jako zdroje dat

  1. V nabídce Data zvolte Zobrazit zdroje dat.

    Otevře se okno Zdroje dat.

    Zvolte Přidat nový zdroj dat. Otevře se Průvodce konfigurací zdroje dat.

  2. Zvolte Objekt, Další.

    Rozbalte Dsl, Company.FarmApp a vyberte Farm, což je kořenová třída modelu. Zvolte Dokončit.

    V Průzkumník řešení teď projekt uživatelského rozhraní obsahuje Vlastnosti\DataSources\Farm.datasource.

    Vlastnosti a relace vaší třídy modelu se zobrazí v okně Zdroje dat.

    Data sources window

Připojení modelu do formuláře

  1. V projektu uživatelského rozhraní odstraňte všechny existující soubory .cs.

  2. Přidejte do projektu uživatelského rozhraní nový soubor FarmControl uživatelského ovládacího prvku.

  3. V okně Zdroje dat v rozevírací nabídce farmy zvolte Podrobnosti.

    U ostatních vlastností ponechte výchozí nastavení.

  4. Otevřete FarmControl.cs v návrhovém zobrazení.

    Přetáhněte farmu z okna Zdroje dat na FarmControl.

    Zobrazí se sada ovládacích prvků, jedna pro každou vlastnost. Vlastnosti relace negenerují ovládací prvky.

  5. Odstraňte farmBindingNavigator. To se také automaticky vygeneruje v návrháři FarmControl , ale pro tuto aplikaci to není užitečné.

  6. Pomocí panelu nástrojů vytvořte dvě instance DataGridView a pojmenujte je AnimalGridView a FieldGridView.

    Poznámka:

    Alternativním krokem je přetažení položek Zvířata a Pole z okna Zdroje dat do ovládacího prvku. Tato akce automaticky vytvoří datové mřížky a vazby mezi zobrazením mřížky a zdrojem dat. Tato vazba však nefunguje správně pro seznamy DSLS. Proto je lepší vytvořit datové mřížky a vazby ručně.

  7. Pokud sada nástrojů neobsahuje nástroj ModelingBindingSource , přidejte ho. V místní nabídce na kartě Data zvolte Zvolit položky. V dialogovém okně Zvolit položky sady nástrojů vyberte Na kartě .NET Framework možnost ModelingBindingSource.

  8. Pomocí panelu nástrojů vytvořte dvě instance ModelingBindingSource a pojmenujte je AnimalBinding a FieldBinding.

  9. Nastavte vlastnost DataSource každého ModelingBindingSource na farmBindingSource.

    Nastavte vlastnost DataMember na Zvířata nebo Pole.

  10. Nastavte vlastnosti AnimalGridView Zdroje dat na AnimalBindinghodnotu a na FieldGridView FieldBindinghodnotu .

  11. Upravte rozložení ovládacího prvku Farma podle svého vkusu.

    ModelingBindingSource je adaptér, který provádí několik funkcí specifických pro seznamy DSLS:

  • Zabalí aktualizace do transakce úložiště VMSDK.

    Když například uživatel odstraní řádek z mřížky zobrazení dat, běžná vazba způsobí výjimku transakce.

  • Zajišťuje, že když uživatel vybere řádek, okno Vlastnosti zobrazí vlastnosti odpovídajícího prvku modelu místo řádku datové mřížky.

    Schema of the DSL binding

    Schéma propojení mezi zdroji dat a zobrazeními

Dokončení vazeb na DSL

  1. Do samostatného souboru kódu v projektu uživatelského rozhraní přidejte následující kód:

    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. V projektu DslPackage upravte DslPackage\DocView.tt aktualizovat následující definici proměnné:

    string viewControlTypeName = "FarmControl";
    

Otestování DSL

Řešení DSL teď může sestavovat a spouštět, i když možná budete chtít později přidat další vylepšení.

  1. Sestavte a spusťte řešení.

  2. V experimentální instanci sady Visual Studio otevřete ukázkový soubor.

  3. V Průzkumníku farmapp otevřete místní nabídku v kořenovém uzlu Farma a zvolte Přidat novou kozu.

    Goat1 zobrazí se v zobrazení Zvířata .

    Upozorňující

    Musíte použít místní nabídku na uzlu Farma , nikoli uzel Zvířata .

  4. Vyberte kořenový uzel farmy a zobrazte jeho vlastnosti.

    V zobrazení formuláře změňte název nebo velikost farmy.

    Když přejdete mimo každé pole ve formuláři, odpovídající vlastnost se změní v okno Vlastnosti.

Vylepšení DSL

Okamžitá aktualizace vlastností

  1. V návrhovém zobrazení FarmControl.cs vyberte jednoduché pole, například Název, Velikost nebo IsOrganic.

  2. V okno Vlastnosti rozbalte datové vazby a otevřete (Upřesnit).

    V dialogovém okně Formátování a rozšířené vazby v části Režim aktualizace zdroje dat zvolte OnPropertyChanged.

  3. Sestavte a spusťte řešení.

    Ověřte, že když změníte obsah pole, odpovídající vlastnost modelu farmy se okamžitě změní.

Zadání tlačítek Pro přidání

  1. V návrhovém zobrazení FarmControl.cs pomocí panelu nástrojů vytvořte tlačítko ve formuláři.

    Upravte název a text tlačítka, například na New Sheep.

  2. Otevřete kód za tlačítkem (například poklikáním).

    Upravte ho následujícím způsobem:

    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; }
    }
    

    Budete také muset vložit následující direktivu:

    
    using Microsoft.VisualStudio.Modeling;
    
  3. Přidejte podobná tlačítka pro kozy a pole.

  4. Sestavte a spusťte řešení.

  5. Ověřte, že nové tlačítko přidá položku. Nová položka by se měla zobrazit v Průzkumníku farmapp i v příslušném zobrazení datové mřížky.

    Měli byste být schopni upravit název prvku v zobrazení datové mřížky. Můžete ho také odstranit odtud.

    Sample data grid view

O kódu pro přidání elementu

U tlačítek nového prvku je následující alternativní kód trochu jednodušší.

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();
  }
}

Tento kód však nenastavuje výchozí název nové položky. Nespustí žádné přizpůsobené sloučení, které jste mohli definovat v direktivách sloučení elementů DSL, a nespustí žádný vlastní slučovací kód, který by mohl být definován.

Proto doporučujeme použít ElementOperations k vytvoření nových prvků. Další informace naleznete v tématu Přizpůsobení vytváření a přesouvání elementů.