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:
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.
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
- Název řešení a DSL:
Experimentujte s počátečním příkladem, který šablona poskytuje:
Transformovat všechny šablony
Sestavte a spusťte ukázku (Ctrl+F5).
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ů aDslPackage
projektů obsahuje řešení třetí projekt s názvemUI.
UI obsahuje definici ovládacího prvku model Windows Forms.DslPackage
závisí na , aUI
závisí naDsl
UI
.DslPackage
V projektu obsahuje kód,UI\DocView.cs
který zobrazuje ovládací prvek model Windows Forms definovaný vUI
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. ProjektUI
obsahuje:Třída model Windows Forms s názvem
ModelViewControl
.Soubor s názvem
DataBinding.cs
, který obsahuje další částečnou definiciModelViewControl
. 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.
Otevřete DslDefinition.dsl v návrháři DSL.
Odstranit ExampleElement
Přejmenujte třídu domény ExampleModel na
Farm
.Zadejte další vlastnosti domény s názvem
Size
typu Int32 aIsOrganic
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
.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ázvemSize
.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í>.
Pomocí nástroje Domain Class vytvořte následující třídy:
Sheep
Goat
Pomocí nástroje Dědičnost vytvořit
Goat
aSheep
dědit zAnimal
.Pomocí nástroje Embedding vložte
Field
aAnimal
v částiFarm
.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.
Transformovat všechny šablony na panelu nástrojů Průzkumník řešení
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
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.
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.
Připojení modelu do formuláře
V projektu uživatelského rozhraní odstraňte všechny existující soubory .cs.
Přidejte do projektu uživatelského rozhraní nový soubor
FarmControl
uživatelského ovládacího prvku.V okně Zdroje dat v rozevírací nabídce farmy zvolte Podrobnosti.
U ostatních vlastností ponechte výchozí nastavení.
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.
Odstraňte farmBindingNavigator. To se také automaticky vygeneruje v návrháři
FarmControl
, ale pro tuto aplikaci to není užitečné.Pomocí panelu nástrojů vytvořte dvě instance DataGridView a pojmenujte je
AnimalGridView
aFieldGridView
.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ě.
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.
Pomocí panelu nástrojů vytvořte dvě instance ModelingBindingSource a pojmenujte je
AnimalBinding
aFieldBinding
.Nastavte vlastnost DataSource každého ModelingBindingSource na farmBindingSource.
Nastavte vlastnost DataMember na Zvířata nebo Pole.
Nastavte vlastnosti
AnimalGridView
Zdroje dat naAnimalBinding
hodnotu a naFieldGridView
FieldBinding
hodnotu .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.
Schéma propojení mezi zdroji dat a zobrazeními
Dokončení vazeb na DSL
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); } } }
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í.
Sestavte a spusťte řešení.
V experimentální instanci sady Visual Studio otevřete ukázkový soubor.
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 .
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í
V návrhovém zobrazení FarmControl.cs vyberte jednoduché pole, například Název, Velikost nebo IsOrganic.
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.
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í
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
.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;
Přidejte podobná tlačítka pro kozy a pole.
Sestavte a spusťte řešení.
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.
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ů.