Pola Desain UI untuk Formulir Windows (seperti MVVM untuk WPF)

159

MVVM paling umum digunakan dengan WPF karena sangat cocok untuk itu. Tapi bagaimana dengan Windows Forms? Apakah ada pola pendekatan / desain yang mapan dan umum digunakan seperti ini untuk Windows Forms juga? Salah satu yang bekerja dengan baik dengan Windows Forms? Apakah ada buku atau artikel yang menggambarkan hal ini dengan baik? Mungkin berbasis MVP atau MVC?

bitbonk
sumber
lihat juga stackoverflow.com/questions/654722/...
Ian Ringrose
5
ini sepertinya pertanyaan yang bagus. lihat suara dan bintang ..
nawfal
13
Bagaimana ini tidak konstruktif ketika tepatnya percakapan yang saya cari? Sedang, tidak mendikte!
CAD mencekik
Jadi pada dasarnya, MVVM untuk WinForms dimungkinkan. Tetapi kebanyakan orang lebih suka berbicara tentang bagaimana mereka menggunakan MVP / MVC di masa lalu, daripada mendorong gagasan Winforms / MVVM ke depan. Atau mereka lebih suka memikirkan bagaimana itu benar-benar disebut Presenter Model bukan MVVM, dan betapa manisnya MVVM untuk WPF.
H. Abraham Chavez
9
Saya selalu kecewa ketika jenis pertanyaan ini ditutup sebagai "tidak konstruktif" karena, seperti poster lain yang sudah disebutkan, jenis diskusi ini adalah apa yang saya cari di sini. Moderator, silakan ambil pandangan yang lebih liberal dan santai di tombol 'tidak konstruktif'.
Tim Long

Jawaban:

94

Saya telah mencoba MVP dan tampaknya berfungsi baik dengan bentuk windows juga. Buku ini memiliki contoh formulir windows dengan pola MVP (contoh aplikasi penggajian). Aplikasi ini tidak begitu rumit tetapi akan memberi Anda ide tentang bagaimana cara membuatnya.

Prinsip, Pola, dan Praktek Agile di C # ...

Anda bisa mendapatkan kode sumber di Kode Sumber

EDIT:

Ada dua variasi pola MVP (a) Tampilan pasif dan (b) pengawas pengawasan

Untuk skenario penyatuan data yang kompleks, saya lebih suka menggunakan pola pengontrol Supervising. Dalam mengawasi pola pengontrol, tanggung jawab penyatuan data terletak pada tampilan. Jadi, untuk treeview / datagrid ini harus dalam pandangan masing-masing, hanya tampilan logika agnostik yang harus dipindahkan ke presenter.

Saya akan merekomendasikan melihat kerangka MVP berikut MVC # - Kerangka MVP

Jangan menggunakan namanya (ini merupakan kerangka kerja MVP).

Winforms sederhana MVP video Winforms - MVP

Contoh berurusan dengan daftar dropdown MVP - DropDownList

Contoh pengikatan treeview sederhana (penjilidan orang miskin). Anda dapat menambahkan logika khusus tampilan pohon di BindTree ().

Di bawah ini adalah cuplikan kode .... tidak diuji, langsung dimasukkan dari pikiran ....

public interface IYourView
{
   void BindTree(Model model);
}

public class YourView : System.Windows.Forms, IYourView
{
   private Presenter presenter;

   public YourView()
   {
      presenter = new YourPresenter(this);
   }

   public override OnLoad()
   {
         presenter.OnLoad();
   }

   public void BindTree(Model model)
   {
       // Binding logic goes here....
   }
}

public class YourPresenter
{
   private IYourView view;

   public YourPresenter(IYourView view)
   { 
       this.view = view;
   }

   public void OnLoad()
   {
       // Get data from service.... or whatever soruce
       Model model = service.GetData(...);
       view.BindTree(model);
   }
}
pillai rajesh
sumber
1
Terima kasih, contoh dalam buku itu agak terlalu sederhana untuk seleraku. Bagaimana saya pergi tentang Winforms dan MVP dengan tampilan data yang lebih kompleks seperti TreeView atau DataGridView berapa banyak (apa) logika akan berada di mana?
bitbonk
bitbonk - Saya telah memperbarui jawabannya dan akan memeriksa apakah saya bisa mendapatkan info lebih lanjut.
rajesh pillai
1
Metode BindTree tampaknya sedikit cacat bagi saya. Tiba-tiba sang View tahu tentang Model itu. Apakah itu hal yang baik? Pasti ada berton-ton orang yang dihadapkan dengan masalah-masalah semacam ini. Saya terkejut bahwa tidak ada buku tentang itu. Karena ada buku tentang segala sesuatu di dunia .NET.
bitbonk
1
Itu bukan cacat. Ini adalah rasa "Pengawas Pengawas" dari pola MVP .. Dalam Pengawas Pengawas, pandangannya mengetahui model (ini adalah model presentasi). Yang lainnya adalah "Tampilan Pasif", di mana tampilan benar-benar dipisahkan dari model.
rajesh pillai
14

Seperti yang sudah dikatakan, saya selalu bekerja dalam pola MVP saat menggunakan WinForms. Namun pola desain yang akan Anda gunakan bukan berarti Anda akan menggunakannya dengan benar. Ada banyak anti-pola yang melekat pada MVP.

Jika Anda ingin memulai semuanya dengan cara yang baik, Anda harus menggunakan kerangka kerja untuk membangun klien yang cerdas. Jadi saya akan merekomendasikan untuk menggunakan desain dan praktik itu: Smart Software Software Factory http://www.codeplex.com/smartclient

Anda memiliki diskusi di sini tentang kerangka kerja klien pintar saat ini: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: Saya suka posting ini di anti-pola MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Semoga ini membantu

alexl
sumber
9

Pola Model-View-ViewModel (MVVM) adalah pola desain. Per definisi pola desain menunjukkan solusi umum di dunia berorientasi objek dan solusi ini dapat diterapkan di berbagai platform (WPF, WinForms, Java Swing, dll.). Saya setuju bahwa MVVM paling baik digunakan dengan WPF karena memanfaatkan kemampuan pengikatan yang kuat. Namun, Formulir Windows juga mendukung pengikatan data.

The WAF Windows Forms Adapter menunjukkan bagaimana menerapkan Pola MVVM dalam Bentuk aplikasi Windows.

jbe
sumber
3
WAF untuk WPF, bukan Windows Forms. Tautannya menyesatkan.
Bentley Davis
2
Tautannya tidak menyesatkan. WAF Windows Forms Adapter hadir dengan aplikasi MVVM yang diimplementasikan dua kali: 1. WinForms; 2. WPF. Kedua aplikasi berbagi lapisan bawah yang tidak tergantung pada teknologi UI.
jbe
5

Saya telah menulis tentang variasi pola desain MVP / MVVM yang disebut MVP-VM, yang merupakan solusi yang dibuat khusus untuk aplikasi winform yang membutuhkan cakupan pengujian penuh dan menggunakan pengikatan data sebagai mekanisme utama untuk menjaga presentasi diperbarui dengan data model.

MVVM untuk .NET Winforms

MVVM (Model View View Model) memperkenalkan pendekatan serupa untuk memisahkan presentasi dari data dalam lingkungan yang memberdayakan pengikatan data (WPF). Sejak .NET framework 2.0 sudah menawarkan infrastruktur pengikat data lanjutan yang juga memungkinkan waktu desain mengikat objek aplikasi - entitas 'Model Tampilan' dapat masuk dengan cukup baik di lingkungan berbasis MVP.

Aviad Ezra
sumber
4

Saya mengajukan pertanyaan yang sama kepada dua rekan kerja teknisi saya: apakah MVVM untuk WindowsForms mungkin? Keduanya memberi saya jawaban yang sama persis: " Tidak mungkin! WindowsForms kehilangan ikatan kaya WPF dan Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) dan juga tidak ada TypeConverters ."

  • Pola Aktivator Layar untuk WindowsForms - Anda dapat menemukannya di sini , porting dari Caliburn.Micro oleh jagui
  • Rich Bindings dan TypeConverters - Truss oleh Kent Boogaart, melakukannya dengan cara yang independen UI
  • Commands - WPF Application Framework (WAF) memiliki proyek WafWinFormsAdapter yang menangani beberapa hal MVVM yaitu perintah

Sekali lagi, dapatkah kita memiliki MVVM untuk WinForms? Ya kita bisa. Kami memiliki semua bagian. Kami hanya harus menempelkannya bersama.

Tiago Freitas Leal
sumber
4

Saya percaya bahwa MVP adalah pola yang sangat cocok untuk pengembangan WinForms - seperti sebagian dibuktikan dengan penggunaannya dalam CAB - kerangka kerja Microsoft untuk WinForms.

Saya menggunakan MVP di WinForms untuk mengekstrak kode dari tampilan - karena saya tidak dapat menguji kode tampilan. Dan juga untuk mengaktifkan kode yang perlu digunakan kembali (atau diduplikasi) untuk tetap keluar dari View di mana ia tidak dapat dibagikan.

Saya bisa merujuk ke proyek saya sendiri di mana saya menggunakan pola MVP ExceptionReporter.NET . Meskipun saya yakin saya tidak menggunakannya dengan sempurna.

Anda menyebutkan MVVM bekerja untuk WPF - Saya pikir alasannya adalah karena dukungan pengikatan data yang kuat. Jika Anda tidak menggunakan data-binding di WPF (dan itu tentu tidak wajib) maka Anda bisa memilih MVP. Intinya adalah bahwa MVP adalah pilihan yang kuat untuk aplikasi sisi klien. Dan mungkin pilihan yang 'lebih baik', bahkan di WPF, jika Anda berencana untuk berbagi kode antar proyek yang bukan WPF.

Untuk bukti lebih lanjut tentang nilai menggunakan MVP di WinForms, lihat presentasi video Boodhoo tentang penggunaan MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter Dan artikel MSDN oleh penulis yang sama di http://msdn.microsoft.com/en-us/magazine/cc188690.aspx

PandaWood
sumber
Barang-barang Boodhoo tampaknya tentang WebForms, bukan WinForms. Kecuali ada lebih banyak hal di video nanti ...?
Roger Lipscombe
3

Metode BindTree tampaknya sedikit cacat bagi saya. Tiba-tiba sang View tahu tentang Model itu. Apakah itu hal yang baik? Pasti ada berton-ton orang yang dihadapkan dengan masalah-masalah semacam ini. Saya terkejut bahwa tidak ada buku tentang itu. Karena ada buku tentang segala sesuatu di dunia .NET.

Desain ini bukan tentang menyembunyikan model, melainkan dengan tepat mendefinisikan interaksi antara berbagai lapisan aplikasi. Anda dapat mengubah backend sepenuhnya dan selama Anda melewati Model melalui Bindtree, UI Anda akan terus bekerja.

Sekarang Model kelas mungkin merupakan pilihan nama yang buruk dalam contoh yang diberikan Rajesh. Itu bisa TreeData, atau RecordsData. Bagaimanapun Anda mendefinisikannya, ia memiliki apa yang Anda perlukan untuk menggunakan mekanisme pengikatan Winforms untuk mengikat kontrol spesifik ke data yang mendasarinya.

Situs terbaik untuk menelusuri materi semacam ini ada di sini . Martin Fowler telah mengumpulkan berbagai pola desain UI yang berguna dan pola desain perusahaan.

Sekali lagi kunci untuk ini adalah penggunaan antarmuka untuk secara tepat menentukan bagaimana setiap lapisan berinteraksi satu sama lain.

Dalam aplikasi saya sendiri (aplikasi CAD / CAM yang digunakan untuk menjalankan mesin pemotong logam) struktur saya terlihat seperti ini.

  • Formulir mengimplementasikan antarmuka bentuk
  • UIDLL dengan tampilan yang mengimplementasikan tampilan antarmuka yang berinteraksi dengan formulir melalui antarmuka bentuk. Tampilan spesifik mendaftar sendiri dengan UIViewDLL Views mengeksekusi Command Objects yang ditemukan di pustaka perintah yang berinteraksi dengan Model.
  • Perpustakaan perintah; daftar perintah yang mengimplementasikan ICommand. Perintah yang berinteraksi dengan tampilan melakukannya melalui antarmuka yang terbuka di UIViewDLL.
  • UIViewDLL; memperlihatkan View Interfaces yang digunakan oleh perintah.
  • Model; kelas dan koleksi yang membentuk struktur data inti dari aplikasi saya. Bagi saya ini adalah hal-hal seperti bahan, jalan setapak, bentuk, lembaran, obor, dll.
  • Utilitas; DLL yang umumnya menggunakan kelas utilitas yang digunakan oleh perusahaan saya yang menjangkau berbagai aplikasi. Misalnya fungsi matematika yang rumit.
RS Conley
sumber
3

Anda bisa menggunakan Arsitektur, Pola, dan Praktik Perusahaan sebagai titik awal, meskipun sedikit ketinggalan zaman.

Di bawah Panduan Umum terdapat Arsitektur Aplikasi untuk .NET: Merancang Aplikasi dan Layanan , yang merupakan pengantar yang baik untuk cara .NET dan aplikasi lapis-lapis N.

alt teks http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

Untuk "pola" yang lebih formal, ada Pola Solusi Perusahaan Menggunakan Microsoft .NET . (sumber: microsoft.com )teks alternatif

Untuk beberapa nama,

Eugene Yokota
sumber
2

Penjelasan bagus pertama dari pola desain UI yang saya baca ada di blog Jeremy Miller - Membangun CAB Anda Sendiri . Ini menjelaskan pola umum - Tampilan Pasif, MVP, dll. Dan membahas beberapa cara Anda dapat menerapkannya dalam C #.

Jeremy
sumber
1

Anda dapat mencoba MugenMvvmToolkit yang memungkinkan untuk menggunakan "MVVM murni" untuk WinForms. Karena itu mendukung binding di semua platform, semua fitur pengikatan asli yang tersedia untuk platform WPF tersedia di semua platform (termasuk WinForms).

Vyacheslav Volkov
sumber