2012-02-15 18 views
7

Temelde bazı MVC'leri olan bir ASP.Net arka planındanım. Ben de biraz Silverlight ve MVVM yaptım, ancak şimdi çok az deneyime sahip olduğum Winforms'a geçmek üzereyim, bu yüzden MVP'nin nasıl üstesinden geleceğimi merak ediyorum.WinPr'lerdeki MVP

Tipik MVP örnekleri, örneğin bir metin kutusu bu özellik değeri koyarak beton görüntüsü, (IView arayüzünün bir tür ile) bir görünüm özelliği ayarlama sunum göstermektedir. Bu arkaik yaklaşım yerine, bir MVP INotifyPropertyChanged kullanabilir ve eğer öyleyse nasıl? Çok hızlı bir örnek gerçekten kullanışlı olurdu! Sonra INotifyPropertyChanged uygulanan bir model oluşturmak için olsaydı

bu fazla gibi MVVM değil mi? (yani sunum yapan kişi modeli günceller ve INotifyPropertyChanged'in sihri aracılığıyla görünüm güncellenir). Ancak MVVM ve Winforms hakkında okudum her yerde, insanlar uygun olmadığını söylüyorlar. Niye ya? Anlayışım, herhangi bir kontrolün mülkiyeti hakkında bilgi verebilmeniz, dolayısıyla Winform'ların eksik olması. WPF ile karşılaştırıldığında Winforms'taki veritabanın eksikliklerini anlamaya çalışıyorum ve MVVM'nin MVP'den daha basit bir şekilde uygulanmasından dolayı neden kullanılamıyor. peşin Andy içinde

teşekkürler.

cevap

8

WinForms uygulamasında veri bağlamanın INotifyPropertyChanged'u nasıl kullandığını kontrol ettim. BindingSource veya model özelliği DataSource nesne DataMember Bu uygulayan tekabül eden, eğer çok destek yapar BindingSource üzerinden bağlama veri INotifyPropertyChanged. Burada, tam kapsamlı bir şekilde sunucu/denetleyiciyi denetleyen M. Fowlers'ı kullanabilirsiniz: El ile yazılmış bir kod bile gerekmez, BindingSource, görünümü her iki yönde de model özelliklerini eşitler > model) ve model INotifyPropertyChanged'u destekliyorsa, görünüm otomatik olarak güncellenir. kod yapılar şimdiye kadar kullanılmış:

  1. görünüşüdür başlatma sırasında:

    this.bindingSource.DataSource = this.presenter;

  2. tasarımcısı tarafından oluşturulan kod:

    this.textBoxPhone.DataBindings.Add (yeni System.Windows.Forms.Binding ("Metin", this.bindingSource, "Model.Phone" true, System.Windows .Forms.DataSourceUpdateMode.OnPropertyChanged));

modeli sınıfı:

public class Customer : INotifyPropertyChanged 
{ 
    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (_firstName == value) 
       return; 
      _firstName = value; 
      NotifyPropertyChanged("FirstName"); 
     } 
    } 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      if (_lastName == value) 
       return; 
      _lastName = value; 
      NotifyPropertyChanged("LastName"); 
     } 
    } 

    private string _company; 
    public string Company 
    { 
     get { return _company; } 
     set 
     { 
      if (_company == value) 
       return; 
      _company = value; 
      NotifyPropertyChanged("Company"); 
     } 
    } 

    private string _phone; 
    public string Phone 
    { 
     get { return _phone; } 
     set 
     { 
      if (_phone == value) 
       return; 
      _phone = value; 
      NotifyPropertyChanged("Phone"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

sunum sınıfı:

public class CustomerPresenter 
{ 
    public CustomerPresenter(Customer model) 
    { 
     if (model == null) 
      throw new ArgumentNullException("model"); 

     this.Model = model; 
    } 

    public Customer Model { get; set; } 

    public ICustomerView View { private get; set; } 
} 
+0

Bunu bilmek gerçekten yararlıdır. Yanıtı gönderdiğiniz için teşekkürler. –

+0

Gerçekten de kullanışlı bir örnek. Bununla birlikte, Modeli doğrudan görünüme açık bir sorun değil mi? Belki bir ViewModel kullanmak daha iyi olurdu. – kasperhj

0

Denetleyici Denetleyici MVP aroması örneklerini bulmaya çalışıyorum, bunu WinForms ile kullanıyorum, çok başarılı bir şekilde söyleyebilirim. Varlıklar INotifyPropertyChanged'i destekliyor, sunum yapan kişi bunları görünüme bağlar ve mülkünüzü bir şey değiştiğinde (kirli kontrol) bilmesi için PropertyChanged olayına abone gönderir. Görünüm sadece verileri ciltlemekle sorumludur, diğer tüm işlevler sunucuya taşınır.

0

Hiçbir şey kaçırmayın. MVVM, WinForms ile çok uygundur. Microsoft, yalnızca WPF ve MVVM modelinin kullanımını kodlamaktadır.

İlgili konular