2009-06-30 11 views
8

Son birkaç gün için winforms kullanarak MVP kalıbı ile uğraşırken, gerçekten nasıl yapacağımı bilmediğim bir şey var. Başka bir görünümden nasıl bir alt form oluşturursunuz? Bu geçerli bir seçenek olur muydu?MVP ile yükleme alt görünümleri

public class MyForm : IMainFormView 
    { 
     private MainFormPresenter pres; 
     public MyForm() { pres = new MainFormPresenter(this); } 

     //Event from interface. 
     public event EventHandler<EventArgs> LoadSecondForm; 

     public void SomeButtonClick() 
     { 
      LoadSecondForm(this, EventArgs.Empty); 
     } 
    } 

    public class MainFormPresenter 
    { 
     private IMainFormView mView; 

     public MainFormPresenter(IMainFormView view) { 
      this.mView = view; 
      this.Initialize(); 
     } 

     private void Initialize() { 
      this.mView.LoadSecondForm += new EventHandler<EventArgs>(mView_LoadSecondForm); 
     } 


     private void mView_LoadSecondForm(object sender, EventArgs e) { 
      SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
      newform.Load(); // Load the form and raise the events on its presenter. 
     } 
    } 

Sana bu kalıbı kullanarak bir alt form yük olur ve Alt form için ilk sayfadan bir kimlik demek geçerdi nasıl nasıl esas endişe ediyorum.

Teşekkürler.

cevap

2

this other SO question'a bir göz atın. WFF ve WinForms ile ilgili olsa da, sorun aynı görünüyor. Temel olarak, bir Hizmet penceresini bir Hizmet penceresi (WindowsService veya DialogService veya buna benzer bir şey olarak adlandırabilirsiniz) gösterme gereği göz önünde bulundurulmalıdır. Bu, nesneleri bir perspektife koymanıza yardımcı olur, çünkü anladığınız anda Bağımlılık Enjeksiyonu cevabı alır.

Yanıtınızda, bunu olaylarla modelliyorsunuz, ancak DialogService'ın ShowDialog yöntemini çağırdığınız daha açık bir modeli tercih ediyorum. Bununla birlikte, her yaklaşımın mekaniği farklı değildir.

1

bu

İlk yapılan yorumlar Birkaç Bu

private void mView_LoadSecondForm(object sender, EventArgs e) { 
     SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
     newform.Load(); // Load the form and raise the events on its presenter. 
    } 

Eğer SecondForm için ThirdForm yerine karar ne olur? Newform = new SecondForm'un her çağrısını bulmanız ve değişikliği yapmalısınız.

Bunun yerine

public class CreateSecondForm : ICommand 
    { 

     public void Execute() { 
      SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
      newform.Load(); // Load the form and raise the events on its presenter. 
     } 

    } 

Sonra buraya bir komut nesnesi SecondForm yaratılmasını yerleştirilmeli ve herhangi başka bir yerde ikinci bir form getirir Eğer bir subsitute istiyorsanız bu sözdizimini

private void mView_LoadSecondForm(object sender, EventArgs e) { 
    CreateSecondForm createCmd = new CreateSecondForm(); 
    createCmd.Execute(); // Load the form and raise the events on its presenter. 
} 

kullanır SecondForm için tamamen yeni bir form, o zaman gitmeniz gereken tek bir yeriniz var. Durum veya ayar değerlerini geçmek istiyorsanız, komutun yapıcısını kullanın. Başka bir Sunum Yapan veya Görüntülemede bile geçiş yapabilir ve bu komutun bu bilgileri arayüzden almasını sağlayabilirsiniz.

Önerdiğim başka bir şey, yeni komutu kullanmak yerine görünümlerinizi uygulayan formları kaydetmenizdir. Bu, başlatma sırasında yapılır ve kayıt defteri, ana uygulama sınıfınızı kapatır. Örneğin,

.

public class MySecondForm : ISecondFormView, IViewForm 
    { 
     //Stuff .... 
     Public ViewFormEnum ViewFormType { 
      return ViewFormEnum.SecondForm; 
     } 
     //Stuff .... 
    } 

başka yerde yazılım

public void InitializeApp() { 
     //Stuff .... 
     MyApp.ViewForm.Add(new MySecondForm); 

     //Stuff .... 

} 

yılında Sonra komut kurulum böyledir.

public class CreateSecondForm : ICommand 
    { 
     myApp theApp; 
     public CreateSecondForm(myApp thisApp) { 
      theApp = thisApp; 
     } 

     public void Execute() { 
      SecondForm newform = theApp.Find(ViewFormEnum.SecondForm); 
      if (newForm != null) 
       newform.Load(); // Load the form and raise the events on its presenter. 
     } 

    } 

Pardon C# bu benim birincil dilim değil. Bu yaklaşımın avantajı, Formları içeren montajın farklı bir Formlar kümesi ile farklı bir montaj için değiştirilebilmesidir. Bu özellikle, form yerine mock sınıflarının yapılabileceği testlerin otomatikleştirilmesi için kullanışlıdır. Tam uygulamanızın bir alt kümesini serbest bırakmak için yararlı olan boş Görünümleri işlemek için de ayarlayabilirsiniz.

Görünümlerinizin oluşturulmasını sarmak için bu komutu kullanmanızı kesinlikle öneririm. Görünümü kaydetmenin ikinci önerisi, uygulamaya bağlı olarak aşırı olabilir. CAD/CAM uygulamasında düzinelerce diyaloğa ve bir 2D metal kesme masasının kurulum ve kontrolünün farklı yönleri için kullanılan farklı ana formlara sahibim. Ancak, şirketimin diğer uygulamalarında, çoğunlukla basit araçlar oldukları için basit bir yaklaşım kullanıyorum.

İlgili konular