2012-02-15 55 views
7

我主要是一个ASP.Net背景与一些MVC。我也做了一点Silverlight和MVVM,但是现在我正要进入我很少有经验的Winforms,所以我想知道如何解决MVP。MVP中的WinForms

典型MVP样品显示演示者设定的图属性(通过某种接口IVIEW的)中,用把该属性值转换成例如一个文本框的具体视图。而不是这种古老的方法,可以在MVP中使用INotifyPropertyChanged,如果是这样的话?一个非常快速的例子会非常有用!

如果我是创造实现INotifyPropertyChanged的那么一款型号是不是更像MVVM? (即演示者更新模型,并通过INotifyPropertyChanged的魔术视图得到更新)。然而到处都是MVVM和Winforms,人们都说它不适合。为什么?我的理解是,你可以绑定任何控件的属性,所以Winforms缺失了什么?我试图理解Winforms中的数据绑定与WPF相比的缺点,以及为什么MVVM无法使用,因为实现比MVP更简单。

预先感谢 安迪。

回答

8

我刚刚检查了WinForms中的数据绑定如何使用INotifyPropertyChanged。如果的BindingSource或模型属性的数据源对象对应于数据成员实现此 的数据通过的BindingSource不真正支持结合INotifyPropertyChanged的。您可以使用M. Fowlers在此处监控演示者/控制器: 您甚至不需要手写代码,即可同时使视图与模型属性在两个方向(模型 - >视图和视图 - >型号),如果型号支持INotifyPropertyChanged则视图将自动更新。 的代码构造我迄今使用:

  1. 在视图初始化:

    this.bindingSource.DataSource = this.presenter;

  2. 设计器生成的代码:

    this.textBoxPhone.DataBindings.Add(新System.Windows.Forms.Binding( “文本”,this.bindingSource, “Model.Phone”,真实,System.Windows .Forms.DataSourceUpdateMode。OnPropertyChanged));

模型类:

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

主讲类:

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

这是真正有用的知道。感谢您发布回复。 – 2012-05-08 10:30:36

+0

的确是一个有用的例子。但是,将模型直接暴露给视图不是一个问题吗?也许最好使用ViewModel。 – kasperhj 2012-05-30 14:38:36

0

试图找到监督控制器MVP的味道的例子,我使用与WinForms的,非常成功,我会说。实体支持INotifyPropertyChanged的,主持人它们绑定到视图,并演示订阅PropertyChanged事件,以便它知道什么时候改变观点的东西(脏检查)。视图仅负责绑定数据,所有其他功能都移至演示者。

0

你不会错过任何东西。 MVVM非常适合WinForms。微软只会鼓励使用WPF和MVVM模式。

相关问题