建立 Windows Form 架構之網域指定的語言
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
您可以使用 Windows Form 顯示定義域專屬語言 (DSL) 模型,而不是使用 DSL 圖表的狀態。 本主題將逐步引導您繫結至 DSL 的 Windows Form 中,使用Visual StudioVisualization and Modeling SDK。
DSL 執行個體,顯示 Windows Form UI 和模型總管。
建立 Windows Form DSL
最小 WinForm 設計工具DSL 範本會建立最小的 DSL,您可以修改以符合您自己的需求。
若要建立最小的 WinForms DSL
建立從 DSL最小 WinForm 設計工具範本。
在此逐步解說中,會假設下列名稱︰
方案和 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
專案包含︰Windows Form 類別,名為
ModelViewControl
。名為
DataBinding.cs
,其中包含的其他部分定義ModelViewControl
。 若要查看其內容,在方案總管] 中、 開啟檔案的捷徑功能表,然後選擇 [檢視程式碼。
關於 UI 專案
當您更新 DSL 定義檔案,以定義您自己的 DSL 時,您必須更新中的控制項UI
專案以顯示您的 DSL。 不同於Dsl
和DslPackage
專案,而範例UI
專案不會產生從DslDefinitionl.dsl
。 您可以加入至產生的程式碼,如果您想,雖然所未涵蓋在本逐步解說.tt 檔案。
更新 DSL 定義
下列這個逐步解說使用 DSL 定義。
若要更新 DSL 定義
DSL 設計工具中開啟 DslDefinition.dsl。
刪除ExampleElement
重新命名ExampleModel網域類別
Farm
。提供額外的網域屬性,名為
Size
型別的Int32,和IsOrganic
型別的布林。注意
如果您刪除根網域類別,然後再建立新的根目錄,您必須重設編輯器根類別屬性。 在DSL Explorer,請選取編輯器。 然後在 [屬性] 視窗中,將根類別到
Farm
。使用具名網域類別工具來建立下列網域類別︰
Field
– 提供這額外的網域屬性名為Size
。Animal
– 在 [屬性] 視窗中,設定繼承修飾詞至抽象。
使用網域類別工具來建立下列類別︰
Sheep
Goat
使用繼承工具,能使
Goat
和Sheep
繼承自Animal
。使用嵌入工具內嵌
Field
和Animal
下Farm
。您可能想要清理圖表。 若要減少重複的項目,使用這裡顯示的樹狀子目錄分葉項目捷徑功能表命令。
轉換所有範本在方案總管 的工具列。
建置Dsl專案。
注意
在這個階段,其他專案將不會建置無誤。 不過,我們要建置 Dsl 專案,讓它的組件可供 [資料來源精靈]。
更新 UI 專案
現在您可以建立新的使用者控制項將會顯示儲存在 DSL 模型中的資訊。 連接至模型的使用者控制項的最簡單方式是透過資料繫結。 資料繫結介面卡類型名為ModelingBindingSource專為連接至非 VMSDK 介面的 Dsl。
若要定義 DSL 模型做為資料來源
在資料] 功能表上,選擇 [顯示資料來源。
資料來源 視窗隨即開啟。
選擇加入新資料來源。 資料來源組態精靈隨即開啟。
選擇物件,下一步。
展開Dsl, Company.FarmApp,然後選取陣列,這是您的模型的根類別。 選擇完成。
在 方案總管UI專案現在會包含Properties\DataSources\Farm.datasource
資料來源視窗中出現的屬性和關聯性的模型類別。
您的模型連接至表單
在UI專案中,刪除所有現有的.cs 檔案。
加入新使用者控制項檔名為
FarmControl
至UI專案。在資料來源 視窗中的,下拉式清單 功能表上陣列,選擇 詳細資料。
保留其他屬性的預設設定。
在 [設計] 檢視中開啟 FarmControl.cs。
拖放到陣列FarmControl 資料來源 視窗中。
一組控制項隨即出現,一個用於每個屬性。 關聯性屬性不會產生的控制項。
刪除farmBindingNavigator。 會產生此錯誤也會自動在
FarmControl
設計工具中,但它並不適用於此應用程式。使用 [工具箱] 中,建立兩個執行個體DataGridView,並將它們
AnimalGridView
和FieldGridView
。注意
替代的步驟是動物和欄位的項目從資料來源視窗拖曳至控制項。 這個動作會自動建立資料格和資料格檢視中與資料來源之間的繫結。 不過,此繫結運作不正常的 Dsl。 因此最好是建立資料格和繫結以手動方式。
如果 [工具箱] 未包含ModelingBindingSource工具,請將它加入。 在捷徑功能表上資料索引標籤上,選擇 選擇項目。 在選擇工具箱項目對話方塊中,選取ModelingBindingSource從**.NET Framework 索引標籤**。
使用 [工具箱] 中,建立兩個執行個體ModelingBindingSource,並將它們
AnimalBinding
和FieldBinding
。設定DataSource每個屬性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
會出現在動物檢視。警告
您必須使用快顯功能表上陣列節點,不動物節點。
選取陣列根節點,並檢視其屬性。
在 [表單] 檢視中,變更名稱或大小伺服器陣列。
當您瀏覽至其他每一個欄位在表單中,在 [屬性] 視窗中的對應屬性變更。
增強 DSL
並立即更新的內容
在 FarmControl.cs [設計] 檢視中,選取簡單的欄位,例如名稱、 大小或 IsOrganic。
在 [屬性] 視窗中,依序展開資料繫結並開啟**(進階)**。
在格式化和進階繫結對話方塊下方資料來源更新模式,選擇 OnPropertyChanged。
建置並執行方案。
請確認當您變更欄位時,立即陣列模型變更的對應屬性的內容。
加入按鈕
在 FarmControl.cs 設計 檢視中,使用工具箱 中,在表單上建立按鈕。
編輯名稱與文字的按鈕,例如以
New Sheep
。按兩下以開啟 [] 按鈕背後的程式碼 (例如)。
編輯,如下所示︰
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來建立新的項目。 如需詳細資訊,請參閱自訂項目的建立和移動。
另請參閱
如何定義定義域專屬語言
撰寫程式碼來自訂定義域專屬語言
Modeling SDK for Visual Studio-定義域專屬語言