Brutus
Brutus

Reputation: 790

Caliburn.Micro - Wrap Model or expose it directly?

I'm currently facing one of the most discussed problems in MVVM: I have a complex Model in my WPF application and I'm not sure how I should display its data to the View.

According to many answers here on StackOverflow and also to this article there are two ways:

  1. to wrap the Model inside the ViewModel by adding a property in the ViewModel for each property in the Model

  2. to expose the Model directly to the view without replicating the properties.

What I understood so far is that the first approach is better from a theoretical point of view, while the second one is a quick shortcut that should be avoided.

In the same article I previously linked, the author writes the following:

In reviewing the sample application from the Caliburn framework, they implement the VM using option 2.

I took a look at the Caliburn.Micro documentation and unfortunately it just uses a simple ViewModel without a real Model, so I don't know how to verify this statement.

Is the author right? Since I'm using Caliburn.Micro should I use the second approach instead of the first one in order to be more "compliant" with the framework implementation?

Upvotes: 2

Views: 295

Answers (2)

mm8
mm8

Reputation: 169240

Since I'm using Caliburn.Micro should I use the second approach instead of the first one in order to be more "compliant" with the framework implementation?

No. Caliburn.Micro is just an MVVM library. How you implement the actual MVVM pattern is entirely up to you.

I agree with @Marek Dzikiewicz that you should wrap the model in a view model class that may implement the INotifyPropertyChanged interface and provide any other UI specific functionality. This code doesn't belong to a business object. You could refer to my answer here for more information:

Reuse the same models in ASP.NET MVC and WPF MVVM

Obviously if the model class is indeed a UI specific class that is not used in any other application and doesn't contain any business logic that is used on the server side, you could modify this class and bind to it directly. But then it is kind of a (sub) view model after all.

Upvotes: 4

Marek Dzikiewicz
Marek Dzikiewicz

Reputation: 2884

Usually it is better to expose view models because that allows you to add additional properties to control the way the data is displayed (for example formatting or concatenating data). However, if you don't need that, there is nothing wrong in exposing the model classes directly.

Upvotes: 3

Related Questions