Beruflich Dokumente
Kultur Dokumente
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
6
Ms
Siguiente blog
Crear un blog
Acceder
Design Codes
Aviad Ezra on software architecture surroundings the .NET environment
Evolution
Before we start digging deep into MVP-VM, lets have a quick review of the patterns from which it has evolved.
Presentation Model
Martin Fowler introduced the Presentation Model pattern as a way of separating presentation behavior from the
user interface, mainly to promote unit testing. With Presentation Model every View has Presentation Model that
encapsulates its presentation behavior (such as how to handle buttonXXX click) and state (whether a check box is
checked/unchecked).
12,460
Design Patterns (10)
MEF (2)
Popular Posts
UML Class Diagram: Association,
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
1/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
Aggregation and Composition
MVVM for .NET Winforms MVPVM (Model View Presenter - View
Model) Introduction
Model View Presenter (MVP)
Design Pattern with .NET Winforms vs. ASP.NET Webforms
UML Sequence Diagram:
Interaction Fragment (Alt, Opt,
Par, Loop, Region)
Twisting the MVC Triad - Model
View Presenter (MVP) Design
Pattern
.NET Remoting Events (with C#
Code Sample).
.NET CLR Thread Pool Internals
UML Activity Diagram Modeling
Parallel Applications
Data Binding of Business Objects
in Visual Studio .NET 2005/8
Whenever the View changes it informs its Presentation Model about the change, in response the
Presentation Model changes the Model as appropriate, reads new data from the Model and
populates its internal view state. In turn, the View updates the screen according to the Presentation
Model updated view state.
The downside of this pattern it that a lot of tedious code is required in order to keep the Presentation Model and
the View synchronized. A way to avoid writing the synchronization code is to bind the Presentation Model
properties to the appropriate widgets on the View such that changes made to the Model will automatically reflect
on the View, and changes made by the user will automatically flow from the View, through the Presentation Model
to the underlying Model object.
Blog Archive
2014 (4)
2013 (1)
2012 (1)
2011 (2)
2010 (7)
2009 (14)
October (2)
September (1)
August (2)
UML 2.0 Component
Diagrams
Modeling the
System L...
MVVM for .NET
Winforms MVPVM (Model View
Presen...
July (2)
June (3)
May (1)
April (1)
March (1)
February (1)
2008 (13)
2007 (1)
With WPF, the bindings between View and View Model are simple to construct because each View
Model object is set as the DataContext of its pair View. If property value in the View Model changes,
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
2/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
the change automatically propagate to the View via data binding. When the user clicks a button in
the View, a command on the View Model executes to perform the requested action. The View
Model, never the View, performs all modifications made to the Model data.
MVP-VM Overview
The View is in charge of presenting the data and processing user inputs. It is tightly coupled to the Presenter so
when user input is triggered (a button has been clicked) it can directly call the appropriate method on the
Presenter. Its widgets are bound to the matching View Model properties such that when a property of the View
Model changes the linked widget is being changed as a result, and when the widget value changes the View
Model property is being changed as a result.
The View Model exposes properties that are bound to its matching View widgets. Some of its properties are
linked directly to the Model object such that any change made to the Model object automatically translate to
change on the View Model and as a result appear on the View and vise versa, and some of its properties reflect
View state that is not related to Model data, e.g whether buttonXXX is enabled. In some cases the View Model is
merely a snapshot of the Model object state so it exposes read-only properties. In this case the attached widgets
cannot be updated by the user.
The Presenter is in charge of presentation logic. It creates the View Model object and assign it with the
appropriate Model object/s and bind it to the View. When its being informed that a user input has been triggered it
executes according to application rules e.g. command the Model to change as appropriate, make the appropriate
changes on the View Model etc. It is synchronized with the Model via Observer-Synchronization so it can react to
changes in the Model according to application rules. In cases were its more appropriate for the Presenter to
change the View directly rather than though its View Model, the presenter can interact with the View though its
interface.
The Model is a bunch of business objects that can include data and behaviors such as querying and updating the
DB and interacting with external services. Such objects that only contain data are referred to as data entities.
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
3/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
As you can see in the figure above, each UI widget is bound to a matching property on the customer view model,
and each property of the customer view model is linked to a matching property on the customer data entity. So
for example, when the user changes the value of the Name textbox the Name property of the customer view
model is automatically updated via data binding, which causes the update on the Name property of the
customer data entity. In the other direction, when the customer data entity changes the changes reflect on the
customer data model which causes the appropriate widgets on the view to change via data binding.
When the user clicks on the Save button, the view responds and calls the appropriate method on the presenter,
which responds according to application logic, in this case - it calls the Save method of the customer dao object.
In cases where the application logic is more sophisticated, the presenter may bypass the view
model and make direct changes on the view through its abstraction. In some cases view model
property can be linked to view widget at one side but not linked to model object at the other side,
in such cases the view model will be prompt to change by the presenter, which will result in the
appropriate change on the view widget.
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
4/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
The AddCustomerView is instantiated by some class in the application and injected with instance of the
CusomerDao (model), it instantiate the AddCustomerPresenter and injects it with the CusomerDao and with itself.
The AddCustomerPresenter prompts the CusomerDao to create a new CustomerDataEntity, instantiate the
AddCustomerViewModel injecting it with the newly created CustomerDataEntity, and calls ShowCustomer on the
AddCustomerView in order to data bind it to the AddCustomerViewModel.
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
5/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
The AddCustomerView responds to click on the Save button and calls the appropriate method on the
AddCustomerPresenter. The AddCustomerPresenter calls ReadUserInput on the AddCustomerView which in
response alerts its internal binding source to reset binding, which causes the content of its widgets to reread into
the AddCustomerViewModel (read more about data binding of business objects). The AddCustomerPresenter
than evaluates the CustomerDataEntity (which was updated automatically since its linked to
AddCustomerViewModel) and checks whether the new customer already exist in the data storage. In case there
are no duplications it commands the CusomerDao (model) to save the customer.
Heres the code:
View
1: public partial class AddCustomerView : Form, IAddCustomerView
2:
3:
{
private AddCustomerPresenter m_presenter;
4:
5:
6:
7:
InitializeComponent();
8:
9:
10:
11:
12:
13:
14:
15:
cusomerViewModelBindingSource.DataSource = customerViewModel;
}
16:
17:
18:
19:
20:
cusomerViewModelBindingSource.EndEdit();
}
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
m_presenter.SaveClicked();
}
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
6/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
31:
32:
33:
34:
m_presenter.CancellClicked();
35:
36:
}
}
Presenter
1: public class AddCustomerPresenter
2: {
3:
4:
5:
6:
7:
8:
9:
m_view = view;
10:
m_customerDao = customerDao;
11:
12:
13:
14:
15:
16:
m_viewModel = customerViewModel;
17:
18:
19:
20:
m_view.ShowCustomer(customerViewModel);
}
21:
22:
23:
24:
m_view.ReadUserInput();
25:
26:
27:
28:
if (duplicateExist)
29:
30:
m_customerDao.Save(customerDataEntity);
31:
32:
m_view.Close();
33:
34:
else
35:
36:
37:
38:
}
}
39:
40:
41:
42:
CustomerDataEntity duplicateCustomerDataEntity =
43:
m_customerDao.GetByName(newCustomerDataEntity.Name);
44:
45:
46:
47:
48:
49:
50:
51:
m_view.Close();
}
52: }
ViewModel
1: public class CustomerViewModel
2: {
3:
4:
5:
6:
7:
8:
m_customerDataEntity = customerDataEntity;
}
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
7/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
get
31:
32:
33:
34:
return age;
35:
36:
}
}
37:
38:
39:
40:
41:
42: }
Download
The case study can be downloaded from here or here
Posted by aviade at 2:51 AM
Labels: Design Patterns, MVP, MVXX
37 comments:
Bhavtosh August 17, 2009 at 3:15 PM
informative article
Reply
aviade
Thanks for the feedback and sorry for the inconvinience, i'd replaced my old online data storage provider
so you should be able to download the source code now.
Reply
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
8/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
Anonymous October 12, 2010 at 12:07 PM
I did not understand why to use it. In fact this application can be build with 3-tier architecture as well,with
more simplicity of code.here i find more complicated code.can u explain me in better way.
Reply
aviade
In simple cases, it make since to move the presenter functionality into the ViewModel, by that we
practically convert the pattern to MVVM.
The nice thing about MVPVM is that the ViewModels only contain properties that reflect the View state,
and it's the presenter responsibility to connect the View with the ViewModel and to handle actions and
events.
Since in winforms we usually use design time binding to bind the ViewModel to the View, I like it better
when the ViewModel is thin and free from handling actions/commands and events.
But, it's only a matter of personal taste, you can go either way :)
Reply
aviade
10x
Since the project is uploaded to Google docs, you need to have Google account to download it through to
provided link.
I uploaded the project to SkyDrive and shared the link in the same place.
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
9/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
If you still cannot download the project, send me an email and I will send you a copy.
Aviad
Reply
aviade
aviade
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
10/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
Then the process would go:
CustomerView.OnSelectedCustomerChanged() -> CustomersPresenter.CustomerChanged() --(updates-> CustomerView.SelectedCustomer
or is the last part a bit redundant... i figured the presenters CustomerChanged would do some validation
on the change then update the view's selected customer.
Thank you again for your feedback it is very much appreciated!
Reply
aviade
Exposing SelectedCustomer through the View interface is the right thing to do given that the Presenter
needs to use it/change it. You don't need to expose event handlers in the View interface, the View should
handle the event and call the appropriate method on the Presenter.
Reply
aviade
This post introduces a way to make the MVVM pattern applicable for 'Windows Forms' applications. In the
post that you're referring to, the pattern is aimed for WPF.
In most cases, for Silverlight and WPF applications (xaml based), I would recommend to stick with MVVM
as it is an established and well known pattern that fits nicely to the data-binding features exposed in WPF
and Silverlight. In Windows Forms however, the data-binding mechanism is different (for example, there's
no automatic command propagation between the View and the ViewModel), so I found that it makes
sense to add the Presenter pattern to compliment the binding between the View and the ViewModel.
Reply
Replies
fabiopand February 7, 2012 at 2:35 PM
Fair enough, thanks for your help! Great article anyway!
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
11/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
HOWARD February 10, 2012 at 8:12 PM
Good article! It is good to try MVVM pattern for winform, just like silverlight and wpf. Thank you.
Reply
aviade
I double checked, the files should be publicly availiable, if you still can't download shoot me an email, I
will reply with the source.
Reply
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
12/13
3/10/2014
Design Codes: MVVM for .NET Winforms MVP-VM (Model View Presenter - View Model) Introduction
Comment as:
Publish
Google Account
Preview
Newer Post
Home
Older Post
http://aviadezra.blogspot.com/2009/08/mvp-mvvm-winforms-data-binding.html
13/13