Windows Formları için UI Tasarım Deseni (WPF için MVVM gibi)


159

MVVM en yaygın olarak WPF ile kullanılır çünkü buna mükemmel şekilde uygundur. Peki Windows Forms ne olacak? Windows Forms için de böyle yerleşik ve yaygın olarak kullanılan bir yaklaşım / tasarım modeli var mı? Windows Forms ile açıkça iyi çalışan bir tane? Bunu iyi anlatan bir kitap ya da makale var mı? Belki MVP veya MVC tabanlı?



5
bu iyi bir soru gibi görünüyor. oy ve yıldızlara bakın ..
nawfal

13
Tam olarak aradığım konuşma olduğunda bu nasıl yapıcı değildir? Orta, dikte değil!
CAD bloke

Temel olarak WinForms için MVVM mümkündür. Ancak çoğu insan, geçmişte Winforms / MVVM fikrini ileriye taşımak yerine MVP / MVC'yi nasıl kullandıklarını konuşmayı tercih ediyordu. Ya da MVVM değil, gerçekten Presenter Modeli olarak adlandırılır ve WPF için MVVM'nin ne kadar tatlı olduğu üzerinde dururlar.
H. Abraham Chavez

9
Bu tür bir soru "yapıcı değil" olarak kapandığında her zaman hayal kırıklığına uğradım, çünkü daha önce bahsedildiği gibi, bu tür bir tartışma tam olarak buraya aradığım şeydi. Moderatörler, lütfen daha liberal bir bakış açısına sahip olun ve 'yapıcı değil' düğmesine tıklayın.
Tim Long

Yanıtlar:


94

MVP denedim ve çok windows formları ile harika görünüyor. Bu kitapta MVP desenli Windows formları örneği bulunmaktadır (örnek bordro uygulaması). Uygulama o kadar karmaşık değil ama nasıl yaratılacağı hakkında bir fikir verecektir.

Çevik Prensipler, Desenler ve C # ...

Kaynak kodunu Kaynak Kodundan alabilirsiniz

DÜZENLE:

MVP modelinin iki varyasyonu vardır (a) Pasif görünüm ve (b) denetleyici kontrolör

Karmaşık veri bağlama senaryoları için Denetleyici denetleyici desenine gitmeyi tercih ederim. Denetleyici modelini denetlerken veri sorumluluğu görüşe aittir. Bu nedenle, ağaç görünümü / veri ızgarası için bu ilgili görünümlerde olmalıdır, yalnızca görünüm agnostik mantığı sunucuya taşınmalıdır.

Aşağıdaki MVP çerçevesine bir göz atmanızı öneririm MVC # - Bir MVP çerçevesi

İsme göre gitmeyin (bu bir MVP çerçevesi).

Basit winforms MVP video Winforms - MVP

MVP açılır liste ile ilgili bir örnek - DropDownList

Basit ağaç görünümü bağlama örneği (fakir adamın bağlama). BindTree () içine treeview'a özgü herhangi bir mantık ekleyebilirsiniz.

Aşağıda kod snippet'i .... test edilmedi, doğrudan düşünceden anahtarlandı ....

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

1
Teşekkürler, bu kitaptaki örnek benim zevkime göre biraz fazla basit. WinViews ve MVP'de TreeView veya DataGridView gibi daha karmaşık veri görüntülemeleri ile ne kadar mantık nerede olur?
bitbonk

bitbonk - Cevabı güncelledim ve daha fazla bilgi alıp alamayacağımı kontrol edeceğim.
rajesh pillai

1
BindTree yöntemi bana biraz kusurlu görünüyor. Aniden Görünüm, Modelden haberdar olur. Bu iyi bir şey mi? Tonlarca insan bu tür sorunlarla yüz yüze gelmelidir. Bu konuda hiç kitap olmadığına şaşırdım. .NET dünyasında her şey hakkında kitaplar var.
bitbonk

1
Bu bir kusur değil. Bu MVP modelinin "Denetleyici Denetleyici" lezzetidir. Denetleyici Denetleyicide, görünüm modelin farkındadır (bu bir sunum modelidir). Diğeri, görünümün modelden tamamen ayrıldığı "Pasif Görünüm" dür.
rajesh pillai

14

Daha önce de söylediği gibi, Winforms kullanırken her zaman bir MVP deseninde çalıştım. Ancak kullanacağınız tasarım deseni doğru kullanacağınız anlamına gelmez. MVP'ye bağlı bir sürü anti-desen var.

Her şeye iyi bir şekilde başlamak istiyorsanız, akıllı istemci oluşturmak için çerçeveyi kullanmanız gerekir. Bu tasarımı ve uygulamaları kullanmanızı tavsiye ederim: Akıllı İstemci Yazılım Fabrikası http://www.codeplex.com/smartclient

Burada mevcut akıllı istemci çerçeveleri hakkında bir tartışmanız var: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

Not: MVP anti-desenleriyle ilgili bu yayını beğendim: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Bu yardımcı olur umarım


9

Model-View-ViewModel (MVVM) Desen tasarım kalıptır. Tanım başına tasarım deseni nesne yönelimli dünyada ortak bir çözüm gösterir ve bu çözüm çeşitli platformlarda (WPF, WinForms, Java Swing, vb.) Uygulanabilir. MVVM'nin WPF ile en iyi şekilde kullanıldığı konusunda hemfikirim çünkü güçlü bağlanma yeteneklerinden yararlanır. Ancak, Windows Forms veri bağlamayı da destekler.

WAF, Windows Adaptörü Forms nasıl bir Windows Forms uygulamasında MVVM Desen uygulamak için gösteriler.


3
WAF, Windows Forms için değil WPF içindir. Bağlantı yanıltıcı.
Bentley Davis

2
Bağlantı yanıltıcı değil. WAF Windows Forms Adapter iki kez uygulanan bir MVVM uygulaması ile birlikte gelir: 1. WinForms; 2. WPF. Her iki uygulama da UI teknolojisinden bağımsız alt katmanları paylaşır.
jbe

5

Tam test kapsamı gerektiren ve sunumun model verileri ile güncel tutulması için ana mekanizma olarak veri bağlamayı kullanan winforms uygulamaları için kişiye özel bir çözüm olan MVP-VM adı verilen MVP / MVVM tasarım modellerinin bir varyasyonu hakkında yazdım.

.NET Winforms için MVVM

MVVM (Model Görünümü Görünüm Modeli), sunumu veri bağlama (WPF) sağlayan bir ortamdaki verilerden ayırmak için benzer bir yaklaşım sunar. .NET framework 2.0 zaten uygulama nesnelerinin tasarım zamanı bağlanmasına izin veren gelişmiş veri bağlama altyapısı sunduğundan, 'Modeli Görüntüle' varlığı MVP tabanlı ortama oldukça iyi uyum sağlayabilir.


4

Aynı soruyu iki teknik çalışanımdan birine sordum: WindowsForms için MVVM mümkün mü? Her ikisi de bana aynı cevabı verdi: " Olmaz! WindowsForms, WPF ve Silverlight'ın zengin bağlantılarını (OneTime, OneWay, TwoWay, OnewayToSource) ve TypeConverters'ı da kaçırıyor ."

  • WindowsForms için Ekran Etkinleştirici Deseni - burada bulabilirsiniz , Caliburn'dan taşınmıştır.Micro by jagui
  • Zengin Bağlama ve TypeConverters - Makas Kent Boogaart tarafından, bir UI bağımsız bir şekilde yapar
  • Komutlar - WPF Uygulama Çerçevesi (WAF) , bazı MVVM öğelerinin komutları ile ilgilenen bir WafWinFormsAdapter projesine sahiptir.

Yine, WinForms için MVVM alabilir miyiz? Evet yapabiliriz. Tüm parçalara sahibiz. Onları birbirine yapıştırmamız gerekiyor.


4

Olarak kısmen de 's kullanımı kanıtlandı - Ben MVP WinForms gelişmesine tam uyan bir model olduğuna inanıyoruz CAB - WinForms için Microsoft'un çerçeve.

View kodunu test edemediğim için MVP WinForms görünümünden kodu ayıklamak için kullanın. Ayrıca, yeniden paylaşılması (veya çoğaltılması) gereken kodun, paylaşılamadığı Görünüm dışında kalmasını sağlamak için.

Ben MVP desen ExceptionReporter.NET kullandığım kendi proje başvurabilirsiniz . Yine de mükemmel kullanmadığımdan eminim.

WVF için çalışan MVVM'den bahsettiniz - bence bunun nedeni güçlü veri bağlama desteğinden kaynaklanıyor. WPF'de veri bağlama kullanmıyorsanız (ve kesinlikle zorunlu değilse) MVP'yi seçebilirsiniz. Mesele şu ki, MVP herhangi bir istemci tarafı uygulaması için güçlü bir seçimdir. Ve WPF olmayan projeler arasında kod paylaşmayı planlıyorsanız, muhtemelen WPF'de bile 'daha iyi' bir seçim.

WinForms'da MVP kullanmanın değerine ilişkin daha fazla kanıt için Boodhoo'nun MVP kullanımı hakkındaki video sunumuna bakın: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter Ve aynı yazarın http://msdn.microsoft.com/en-us/magazine/cc188690.aspx adresindeki bir MSDN makalesi


Boodhoo'nun içeriği WinForms ile değil, WebForms ile ilgilidir. Videoda daha sonra başka şeyler olmadıkça ...?
Roger Lipscombe

3

BindTree yöntemi bana biraz kusurlu görünüyor. Aniden Görünüm, Modelden haberdar olur. Bu iyi bir şey mi? Tonlarca insan bu tür sorunlarla yüz yüze gelmelidir. Bu konuda hiç kitap olmadığına şaşırdım. .NET dünyasında her şey hakkında kitaplar var.

Bu Tasarım, modeli gizlemekle değil, uygulamaların farklı katmanları arasındaki etkileşimleri tam olarak tanımlamakla ilgili değildir. Arka ucu tamamen değiştirebilirsiniz ve bir modeli Bindtree'den geçirdiğiniz sürece arayüzünüz çalışmaya devam eder.

Şimdi Sınıf Modeli Rajesh'in verdiği örnekte kötü bir isim olabilir. TreeData veya RecordsData olabilir. Ne kadar tanımlasanız da, belirli bir denetimi temeldeki verilere bağlamak için Winforms'un bağlama mekanizmasını kullanmanız gereken her şeye sahiptir.

Bu tür malzemelere göz atmak için en iyi site burada . Martin Fowler, çeşitli kullanışlı UI tasarım deseni ve kurumsal tasarım desenleri topladı.

Yine bunun anahtarı, her katmanın birbiriyle nasıl etkileşime girdiğini kesin olarak tanımlamak için arabirimlerin kullanılmasıdır.

Kendi uygulamamda (metal kesme makinelerini çalıştırmak için kullanılan bir CAD / CAM uygulamaları) yapım böyle görünüyor.

  • Form arabirimlerini uygulayan formlar
  • Form arabirimi aracılığıyla formlarla etkileşime giren görünüm arabirimlerini uygulayan görünümlere sahip UIDLL. Belirli görünümler kendilerini UIViewDLL Görünümleri ile kaydeder Model ile etkileşim kuran komut kütüphanelerinde bulunan Komut Nesneleri yürütür.
  • Komut kütüphaneleri; ICommand uygulayan komutların listesi. Görünümlerle etkileşim kuran komut, UIViewDLL'de gösterilen arabirimler aracılığıyla bunu yapar.
  • UIViewDLL; komutlar tarafından kullanılan Görünüm Arabirimlerini gösterir.
  • Model; uygulamamın temel veri yapılarını oluşturan sınıflar ve koleksiyon. Benim için bunlar malzeme, kesim yolları, şekil, levhalar, el fenerleri vb.
  • Yarar; şirket tarafından kullanılan ve farklı uygulama yayılan yardımcı program sınıfları kullanılan bir DLL. Örneğin karmaşık matematik fonksiyonları.

3

Kurumsal Mimari, Desenler ve Uygulamaları , biraz tarihli olmalarına rağmen başlangıç ​​noktası olarak kullanabilirsiniz .

Genel Rehberlik altında .NET için Uygulama Mimarisi vardır : .NET yollarına ve katmanlı N katmanlı uygulamaya iyi bir giriş olan Uygulamalar ve Hizmetler Tasarlama .

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

Daha resmi "kalıplar" için, Microsoft .NET kullanan Kurumsal Çözüm Kalıpları vardır . (kaynak: microsoft.com )alternatif metin

Birkaç isim,


2

Okuduğum UI tasarım modellerinin ilk iyi açıklaması Jeremy Miller'ın blogunda - Your Your CAB'ı Oluşturmaktı . Genel kalıpları (Pasif Görünüm, MVP, vb.) Tanımlar ve bunları C # 'da uygulayabileceğiniz bazı yolları ele alır.


1

WinForms için "saf MVVM" kullanımına izin veren MugenMvvmToolkit'i deneyebilirsiniz . Tüm platformlarda bağlamaları desteklemesi nedeniyle, tüm platformlarda mevcut olan WPF platformu için mevcut tüm yerel ciltleme özellikleri (WinForms dahil).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.