Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Best Practices: Do custom controls work well with the MVVM design?

I was looking at creating a common control that I will be able to reuse on my pages: an AddressControl which has Address1, Address2, City, State, Zip, etc...

Originally I just created a class (AddressEntity) that contained all these items and implemented INotifyPropertyChanged. I included that class as a DependencyProperty in my Code-Behind for the AddressControl and used it as the DataContext for the bindings to its properties.

Then, someone said my code was ugly and I should look into MVVM. Looking at it, I assume that:

  • AddressEntity.cs will just be a container of data (i.e. Address1, Address2, etc.) and members (i.e. Clone, ToString, etc.)
  • I need some AddressViewModel to wrap my AddressEntity in and provide the PropertyNotification Changes, Validation, etc.
  • I need to somehow have a "View" for this.

The problem is every example I've ever seen has a UserControl as the View and not a CustomControl. Before I delve too deep into this...

  • Is it possible to use MVVM + Custom Controls for this example?
  • Is it pretty much the same thing (UserControl vs CustomControl) as the View with the exception of primary differences of UserControl vs CustomControl? Basically, is my CustomControl really just a View?

References: The Model-View-ViewModel (MVVM) Design Pattern for WPF

like image 759
myermian Avatar asked Aug 16 '10 20:08

myermian


People also ask

Should I use MVVM for WPF?

The Windows Presentation Framework (WPF) takes full advantage of the Model-View-ViewModel (MVVM) pattern. Though it is possible to create WPF applications without using the MVVM pattern, a little investment in learning can make building WPF applications much simpler.

Is there controller in MVVM?

In MVC, controller is the entry point to the Application, while in MVVM, the view is the entry point to the Application.

What is MVVM in WPF How does it work?

MVVM (Model-View-ViewModel) MVVM is a way of creating client applications that leverages core features of the WPF platform, allows for simple unit testing of application functionality, and helps developers and designers work together with less technical difficulties.


2 Answers

CustomControls are never done with mvvm.

What you want is a reusable view(user control) of your data and not a control(custom control).

UserControls and CustomControls are two completely different beasts.

EDIT:

Notwithstanding why UserControls were originally developed, in MVVM typically you use a UserControl when you want a reuseable view which is specific to your model/viewmodel. Its just XAMl without any code behind (except for the auto generated InitializeComponent stuff). Generally you keep a UserControl in the same project that you use it in.

You go for a CustomControl when you want a generic piece of functionality which requires a view and which has potential use even outside the scope of your current application. Here the control is actually defined in a code file and the look (which can be overriden) comes via XAML in a resource dictionary. Generally you keep a CustomControl in a a seperate ControlLibrary project and reference the library in the project you wish to use it in.

With due respect to WallStreetProgrammer, choosing between a user control and a custom control based solely on whether or not you want a lookless control is a bit naive.

like image 191
NVM Avatar answered Nov 16 '22 00:11

NVM


When using MVVM the Model and ViewModel should not be dependent on the View, that is they should not care what kind of view use them.

The difference between a custom control and a usercontrol in WPF is that the custom control is lookless and can be customized via its ControlTemplate. This is what you should write if you are writing a generic control library, like Microsoft does. If you however have a specific look in mind for you control, just go with a user control, it is much faster but will only have one look, the one you define for it.

It is common to use a mix of custom controls and user controls in a MVVM project. For example you would probably use a bunch of custom controls from Microsoft (like textboxes and textblocks) and combine them into user controls.

See Control Authoring Overview

like image 37
Wallstreet Programmer Avatar answered Nov 16 '22 00:11

Wallstreet Programmer