Bagikan melalui


Membuat Bahasa Khusus Domain berbasis Formulir Windows

Anda dapat menggunakan Formulir Windows untuk menampilkan status model bahasa khusus domain (DSL), alih-alih menggunakan diagram DSL. Topik ini memandikan Anda mengikat Formulir Windows ke DSL dengan menggunakan Visualisasi Visualisasi dan Pemodelan SDK Visual Studio.

Gambar berikut menunjukkan UI Formulir Windows dan penjelajah model untuk instans DSL:

DSL instance in Visual Studio

Membuat DSL Formulir Windows

Templat DSL Minimal WinForm Designer membuat DSL minimal yang dapat Anda ubah agar sesuai dengan kebutuhan Anda sendiri.

  1. Buat DSL dari templat Minimal WinForm Designer .

    Dalam panduan ini, nama-nama berikut diasumsikan:

    • Solusi dan nama DSL: FarmApp
    • Kumpulan nama XML: Company.FarmApp
  2. Bereksperimenlah dengan contoh awal yang disediakan templat:

    1. Ubah Semua Templat.

    2. Buat dan jalankan sampel (Ctrl+F5).

    3. Dalam instans eksperimental Visual Studio, buka Sample file dalam proyek penelusuran kesalahan.

      Perhatikan bahwa itu ditampilkan dalam kontrol Formulir Windows.

      Anda juga dapat melihat elemen model yang ditampilkan di Explorer.

      Tambahkan beberapa elemen baik dalam formulir atau Explorer, dan perhatikan bahwa elemen tersebut muncul di tampilan lain.

    Dalam instans utama Visual Studio, perhatikan poin-poin berikut tentang solusi DSL:

  • DslDefinition.dsl tidak berisi elemen diagram. Ini karena Anda tidak akan menggunakan diagram DSL untuk melihat model instans DSL ini. Sebagai gantinya, Anda akan mengikat Formulir Windows ke model, dan elemen pada formulir akan menampilkan model.

  • Selain Dsl proyek dan DslPackage , solusinya berisi proyek ketiga bernama UI.proyek UI berisi definisi kontrol Formulir Windows. DslPackage tergantung pada UI, dan UI tergantung pada Dsl.

  • DslPackage Dalam proyek, UI\DocView.cs berisi kode yang menampilkan kontrol Formulir Windows yang ditentukan dalam UI proyek.

  • Proyek berisi UI sampel kerja kontrol formulir yang terikat ke DSL. Namun, ini tidak akan berfungsi ketika Anda telah mengubah Definisi DSL. Proyek berisi UI :

    • Kelas Formulir Windows bernama ModelViewControl.

    • File bernama DataBinding.cs yang berisi definisi parsial tambahan dari ModelViewControl. Untuk melihat kontennya, di Penjelajah Solusi, buka menu pintasan untuk file dan pilih Tampilkan Kode.

Tentang proyek UI

Ketika Anda memperbarui file Definisi DSL untuk menentukan DSL Anda sendiri, Anda harus memperbarui kontrol dalam UI proyek untuk menampilkan DSL Anda. Dsl Tidak seperti proyek dan DslPackage , proyek sampel UI tidak dihasilkan dari DslDefinitionl.dsl. Anda dapat menambahkan file .tt untuk menghasilkan kode jika Anda mau, meskipun itu tidak tercakup dalam panduan ini.

Memperbarui definisi DSL

Gambar berikut adalah definisi DSL yang digunakan dalam panduan ini.

DSL definition

  1. Buka DslDefinition.dsl di perancang DSL.

  2. Hapus ExampleElement

  3. Ganti nama kelas domain ExampleModel menjadi Farm.

    Berikan properti domain tambahan bernama Size tipe Int32, dan IsOrganic jenis Boolean.

    Catatan

    Jika Anda menghapus kelas domain akar lalu membuat akar baru, Anda harus mengatur ulang properti Kelas Akar Editor. Di DSL Explorer, pilih Editor. Kemudian di jendela Properti, atur Kelas Akar ke Farm.

  4. Gunakan alat Kelas Domain Bernama untuk membuat kelas domain berikut:

    • Field - Berikan ini properti domain tambahan bernama Size.

    • Animal - Di jendela Properti, atur Pengubah Warisan ke Abstrak.

    Catatan

    Alat Kelas Domain Bernama dan alat lain yang disebutkan di bagian ini ditemukan di jendela alat Kotak Alat . Anda dapat membuka atau menyembunyikan jendela ini dengan Kotak Alat Tampilan>.

  5. Gunakan alat Kelas Domain untuk membuat kelas berikut:

    • Sheep

    • Goat

  6. Gunakan alat Warisan untuk membuat Goat dan Sheep mewarisi dari Animal.

  7. Gunakan alat Penyematan untuk menyematkan Field dan Animal di bawah Farm.

  8. Anda mungkin ingin merapikan diagram. Untuk mengurangi jumlah elemen duplikat, gunakan perintah Bring Subtree Here pada menu pintasan elemen daun.

  9. Ubah Semua Templat di toolbar Penjelajah Solusi.

  10. Bangun proyek Dsl.

    Catatan

    Pada tahap ini, proyek lain tidak akan dibangun tanpa kesalahan. Namun, kami ingin membangun proyek Dsl sehingga perakitannya tersedia untuk Wizard Sumber Data.

Memperbarui proyek UI

Sekarang Anda dapat membuat kontrol pengguna baru yang akan menampilkan informasi yang disimpan dalam model DSL. Cara term mudah untuk menyambungkan kontrol pengguna ke model adalah melalui pengikatan data. Jenis adaptor pengikatan data bernama ModelingBindingSource dirancang khusus untuk menghubungkan DLL ke antarmuka non-VMSDK.

Menentukan model DSL Anda sebagai sumber data

  1. Pada menu Data , pilih Perlihatkan Sumber Data.

    Jendela Sumber Data terbuka.

    Pilih Tambahkan Sumber Data Baru. Wizard Konfigurasi Sumber Data terbuka.

  2. Pilih Objek, Berikutnya.

    Perluas Dsl, Company.FarmApp, dan pilih Farm, yang merupakan kelas akar model Anda. Pilih Selesai.

    Dalam Penjelajah Solusi, proyek UI sekarang berisi Properties\DataSources\Farm.datasource

    Properti dan hubungan kelas model Anda muncul di jendela Sumber Data.

    Data sources window

Koneksi model Anda ke formulir

  1. Dalam proyek UI, hapus semua file .cs yang ada.

  2. Tambahkan file Kontrol Pengguna baru bernama FarmControl ke proyek UI.

  3. Di jendela Sumber Data, pada menu drop-down di Farm, pilih Detail.

    Biarkan pengaturan default untuk properti lainnya.

  4. Buka FarmControl.cs dalam tampilan desain.

    Seret Farm dari jendela Sumber Data ke FarmControl.

    Sekumpulan kontrol muncul, satu untuk setiap properti. Properti hubungan tidak menghasilkan kontrol.

  5. Hapus farmBindingNavigator. Ini juga secara otomatis dihasilkan dalam perancang FarmControl , tetapi tidak berguna untuk aplikasi ini.

  6. Menggunakan kotak alat, buat dua instans DataGridView, dan beri nama AnimalGridView dan FieldGridView.

    Catatan

    Langkah alternatifnya adalah menyeret item Hewan dan Bidang dari jendela Sumber Data ke kontrol. Tindakan ini secara otomatis membuat kisi data dan pengikatan antara tampilan kisi dan sumber data. Namun, pengikatan ini tidak berfungsi dengan benar untuk DLL. Oleh karena itu, lebih baik membuat kisi dan pengikatan data secara manual.

  7. Jika Kotak Alat tidak berisi alat ModelingBindingSource , tambahkan. Pada menu pintasan tab Data, pilih Pilih Item. Dalam dialog Pilih Item Kotak Alat, pilih PemodelanBindingSource dari tab .NET Framework.

  8. Menggunakan Kotak Alat, buat dua instans ModelingBindingSource, dan beri nama AnimalBinding dan FieldBinding.

  9. Atur properti DataSource dari setiap ModelingBindingSource ke farmBindingSource.

    Atur properti DataMember ke Hewan atau Bidang.

  10. Atur properti DataSource ke AnimalGridView AnimalBinding, dan dari FieldGridView ke FieldBinding.

  11. Sesuaikan tata letak kontrol Farm sesuai selera Anda.

    ModelingBindingSource adalah adaptor yang melakukan beberapa fungsi yang khusus untuk DLL:

  • Ini membungkus pembaruan dalam Transaksi Penyimpanan VMSDK.

    Misalnya, ketika pengguna menghapus baris dari kisi tampilan data, pengikatan reguler akan menghasilkan pengecualian transaksi.

  • Ini memastikan bahwa, ketika pengguna memilih baris, jendela Properti menampilkan properti elemen model yang sesuai, bukan baris kisi data.

    Schema of the DSL binding

    Skema tautan antara sumber data dan tampilan.

Menyelesaikan pengikatan ke DSL

  1. Tambahkan kode berikut dalam file kode terpisah dalam proyek 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. Dalam proyek DslPackage, edit DslPackage\DocView.tt untuk memperbarui definisi variabel berikut:

    string viewControlTypeName = "FarmControl";
    

Menguji DSL

Solusi DSL sekarang dapat membangun dan menjalankan, meskipun Anda mungkin ingin menambahkan peningkatan lebih lanjut nanti.

  1. Membangun dan menjalankan solusi.

  2. Dalam instans eksperimental Visual Studio, buka File sampel .

  3. Di FarmApp Explorer, buka menu pintasan pada simpul akar Farm, dan pilih Tambahkan Kambing Baru.

    Goat1 muncul dalam tampilan Hewan .

    Peringatan

    Anda harus menggunakan menu pintasan pada simpul Peternakan, bukan simpul Hewan.

  4. Pilih simpul akar Farm dan lihat propertinya.

    Dalam tampilan formulir, ubah Nama atau Ukuran farm.

    Saat Anda menavigasi menjauh dari setiap bidang dalam formulir, properti terkait berubah di jendela Properti.

Meningkatkan DSL

Membuat properti segera diperbarui

  1. Dalam tampilan desain FarmControl.cs, pilih bidang sederhana seperti Nama, Ukuran, atau IsOrganic.

  2. Di jendela Properti, perluas DataBindings dan buka (Tingkat Lanjut).

    Dalam dialog Pemformatan dan Pengikatan Tingkat Lanjut, di bawah Mode Pembaruan Sumber Data, pilih OnPropertyChanged.

  3. Membangun dan menjalankan solusi.

    Verifikasi bahwa saat Anda mengubah konten bidang, properti terkait dari model Farm segera berubah.

Sediakan tombol Tambahkan

  1. Dalam tampilan desain FarmControl.cs, gunakan kotak alat untuk membuat tombol pada formulir.

    Edit nama dan teks tombol, misalnya ke New Sheep.

  2. Buka kode di belakang tombol (misalnya dengan mengklik dua kali).

    Edit sebagai berikut:

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

    Anda juga perlu menyisipkan arahan berikut:

    
    using Microsoft.VisualStudio.Modeling;
    
  3. Tambahkan tombol serupa untuk Kambing dan Bidang.

  4. Membangun dan menjalankan solusi.

  5. Verifikasi bahwa tombol baru menambahkan item. Item baru akan muncul di FarmApp Explorer dan dalam tampilan kisi data yang sesuai.

    Anda harus dapat mengedit nama elemen dalam tampilan kisi data. Anda juga dapat menghapusnya dari sana.

    Sample data grid view

Tentang kode untuk menambahkan elemen

Untuk tombol elemen baru, kode alternatif berikut sedikit lebih sederhana.

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

Namun, kode ini tidak mengatur nama default untuk item baru. Ini tidak menjalankan penggabungan yang disesuaikan yang mungkin telah Anda tentukan dalam Arahan Gabungan Elemen DSL, dan tidak menjalankan kode penggabungan kustom apa pun yang mungkin telah ditentukan.

Oleh karena itu, kami sarankan Anda menggunakan ElementOperations untuk membuat elemen baru. Untuk informasi selengkapnya, lihat Menyesuaikan Pembuatan dan Gerakan Elemen.