建立 Windows Form 架構之網域指定的語言
您可以使用Windows Form顯示Domain-Specific Language (DSL)模型的狀態,而不是使用DSL圖表。 這個主題可以為您解說繫結Windows Form加入DSL,使用 Visual Studio Visualization and Modeling SDK。
DSL的執行個體,顯示Windows Form和UI模型總管。
建立Windows Form DSL
[最小WinForm設計工具] DSL範本建立您可以修改以符合需求的最小DSL。
建立最小的WinForms DSL
若要從 [最小WinForm設計工具] 範本建立DSL。
在這個逐步解說中,假設下列名稱:
方案和DSL名稱
FarmApp
命名空間
Company.FarmApp
使用樣板提供的初始範例進行實驗:
轉換所有範本。
建置並執行這個範例([CTRL+F5])。
在Visual Studio的實驗執行個體中, Sample 開啟在偵錯專案的檔案。
請注意在Windows Form控制項中顯示。
您也可以在檔案總管中顯示的模型項目。
在表單中加入一些項目或檔案總管,並注意它們出現在另一個顯示。
在主要執行個體, Visual Studio請注意如需DSL方案的重點:
DslDefinition.dsl 不包含圖表項目。 這是因為,您不會使用DSL圖表檢視DSL模型執行個體。 因此,您必須繫結至Windows Form加入至模型,,然後在表單的項目將會顯示這個模型。
除了 Dsl 和 DslPackage 專案之外,方案包含第三個專案 UI. UI] 名稱專案包含Windows Form控制項的定義。 DslPackage 依賴, UI而 UI 依賴 Dsl。
在 DslPackage 專案中, UI\DocView.cs 包含顯示Windows Form控制項在 UI 專案中定義的程式碼。
UI 專案包含表單控制項的運作範例繫結至DSL。 不過,在中,當您變更了DSL定義,它就無法運作。 UI 專案包含:
名為的 ModelViewControlWindows Form類別。
包含其他部分定義名為的 ModelViewControl DataBinding.cs 檔案中。 若要查看其內容,請在 [方案總管] 開啟檔案的捷徑功能清單 [檢視程式碼]並選取[]。
如需UI專案
當您更新DSL定義檔案定義自己的DSL,您必須更新專案中的 UI 控制項會顯示您的DSL。 不同 Dsl 於、和 DslPackage 專案中, UI 範例專案不會 DslDefinitionl.dsl產生。 您可以將.tt檔產生程式碼,如果需要,,雖然本逐步解說中並未涵蓋。
更新DSL定義
下列DSL定義在這個逐步解說。
更新DSL定義
開啟DSL在設計工具中DslDefinition.dsl。
刪除 [ExampleElement]
將 [ExampleModel] 網域 陣列類別重新命名為。
為它提供其他網域屬性中命名 大小 Int32]型別和 IsOrganic 型別。 [布林值]
注意事項 如果您刪除根網域類別來建立新的根,就必須重新設定編輯器是類別的屬性。在 [DSL總管][]中, [編輯器]選取[]。然後在[屬性]視窗中, [根類別 陣列將設為。
使用 [將的網域類別] 工具來建立下列領域類別:
欄位 –請將名為的 大小其他網域屬性。
動物 –在[屬性]視窗中, [繼承修飾詞 抽象]將設為。
使用 [網域類別] 工具來建立下列類別:
執行羊
山羊
使用 [繼承] 工具產生 山羊 並 執行羊 繼承自。 動物
使用 [內嵌] 工具內嵌 欄位 和 動物 下 陣列一個。
您可能會想要排列圖表。 若要減少重複的項目數目,請使用 [帶樹狀子目錄這裡] 在分葉項目捷徑功能上的命令。
[轉換所有範本] 在[方案總管]工具列上。
建立 [Dsl] 專案。
注意事項 在這個狀況下,其他專案將不會建置而無錯誤。不過,我們會建立Dsl專案,使其組件提供資料來源精靈。
更新UI專案
現在您可以建立將資訊顯示在DSL模型所儲存的新使用者控制項。 讓您輕鬆連接使用者控制項加入至模型是透過資料繫結。 名為 [ModelingBindingSource] 的資料繫結介面卡型別特別設計DSL連接至非VMSDK介面。
若要定義您自己的DSL模型中做為資料來源
在 [資料] 功能表上,選擇[ [顯示資料來源]]。
[資料來源] 視窗隨即開啟。
選取 [加入新資料來源]。 [資料來源組態精靈] 隨即開啟。
選取 [物件], [下一步]否則為。
展開 [Dsl], [Company.FarmApp], [陣列]然後選取[],為您的模型根類別。 選取 [完成]。
在[方案總管]中, [UI] 專案現在包含 Properties\DataSources\Farm.datasource
您的模型類別屬性和關聯會出現在[資料來源]視窗。
連接您的模型加入至表單
在 [UI] 專案中,刪除所有現有的.cs檔案。
將名為的 FarmControl 新 [使用者控制項] 檔案加入至專案。 [UI]
在 [資料來源] 視窗中,在 [陣列]下拉式功能清單, [詳細資料]請選取[]。
保留其他屬性的預設值。
開啟在設計檢視中FarmControl.cs。
從[FarmControl上的資料來源視窗拖曳 [陣列] 。
一組控制項的外觀,每個屬性的。 相關聯的屬性不會產生控制項。
刪除 [farmBindingNavigator]。 這會在 FarmControl 設計工具會自動產生,不過,此應用程式並不是很有用。
使用工具方塊,建立兩個執行個體, [DataGridView]並將它們命名 AnimalGridView 為和 FieldGridView。
注意事項 替代步驟將拖曳動物和欄位從[資料來源]視窗將項目拖曳至控制項。這個動作會自動建立資料格和繫結方格中檢視和資料來源之間。但是,當配套不為DSL正確運作。因此手動建立資料格和繫結較佳。
如果工具方塊不 [ModelingBindingSource] 包含工具,將其加入。 在 [資料]索引標籤上的捷徑功能清單, [選取項目]請選取[]。 在 [選取工具方塊項目。] 對話方塊中,從 .NET Framework Tab]功能表中選取 [ModelingBindingSource] 。
使用工具方塊,建立兩個執行個體, [ModelingBindingSource]並將它們命名 AnimalBinding 為和 FieldBinding。
每 [ModelingBindingSource farmBindingSource [資料來源 ] 個設定屬性。
將 [DataMember] 屬性設定為或 [動物 欄位]。
將 [資料來源] 屬性設定 AnimalGridView 為 AnimalBinding[]。 FieldGridView FieldBinding
對陣列口味調整控制項的配置。
[ModelingBindingSource] 是執行數個函式是針對DSL的配接器:
它包裝在VMSDK存放區交易的更新。
例如,在中,當使用者刪除資料檢視方格中的資料列,規則繫結交易產生例外狀況。
這可確定,在中,當使用者選取資料列時, [屬性]視窗會顯示所對應的模型項目的屬性,而不是資料格的資料列。
連結結構描述資料來源和檢視之間的。
完成繫結至DSL
將在個別程式碼檔案中的下列程式碼 [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); } } }
在 [DslPackage] 專案中, [DslPackage \ DocView.tt] 編輯更新下列變數定義:
string viewControlTypeName = "FarmControl";
測試DSL
DSL方案可以建置並執行,不過,您稍後可能需要將進一步改善。
測試DSL
建置並執行方案。
在Visual Studio的實驗執行個體中, [範例] 開啟檔案。
在 [FarmApp總管]中,開啟位於根節點的 [陣列] 捷徑功能清單, [將新的山羊]然後選取[]。
Goat1 出現在[]檢視 [動物] 。
警告
您必須使用 [陣列]節點,不是這個 [動物] 節點的捷徑功能清單。
選取 [陣列] 根節點並檢視其屬性。
在表單檢視, [Name] 請變更或 [大小] 陣列。
當您離開每個表單欄位時,對應的屬性在[屬性]視窗中變更。
引發DSL
立即執行更新屬性。
在FarmControl.cs設計檢視中,選取一個簡單的欄位(例如名稱、大小、IsOrganic。
在[屬性]視窗中, [DataBindings] 展開[]並開啟 [(進展)]。
在 [格式化和進階繫結。]對話方塊, [資料來源更新模式]請在[]底下,選取 [OnPropertyChanged][]。
建置並執行方案。
驗證,當您變更欄位的內容模型,陣列中的對應屬性就立即變更。
若要提供加入按鈕
在FarmControl.cs設計檢視,請使用工具來建立表單上的按鈕。
編輯按鈕的名稱和文字,例如 新的執行羊。
在按下按鈕後開啟程式碼(例如在中按兩下)。
編輯如下所示:
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;
將山羊和欄位中的按鈕類似。
建置並執行方案。
確認新的按鈕將項目。 新項目會出現在FarmApp總管和套用適當的資料格檢視。
您應該可以編輯項目的名稱在資料格檢視。 您也可以將它刪除從該處。
如需加入項目的程式碼
如需新項目按鈕,下列替代程式碼會比較簡單。
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 建立新項目的項目。 如需詳細資訊,請參閱自訂項目的建立和移動。
請參閱
概念
Visualization and Modeling SDK - 網域指定的語言