views:

1328

answers:

5

I'm working on a new WPF application and I'm trying to stay as close to the MVVM pattern as I can. My XAML files right now have no codebehinds, and all my interactivity is achieved using Josh Smith's RelayCommand class and commands in my ViewModel classes.

This worked great until I started working on the housekeeping tasks, such as an about box and a system preferences page. I want to have these as modal dialogs, but if I create a RelayCommand to open these pages, I'll be creating a dependency on the view within my view model.

This strikes me as against the grain of the MVVM pattern.

Is there an established method for creating new windows (modal and/or modeless) within the MVVM pattern without creating a dependency? It seems the only way I can keep the ViewModel clean is to create a Click event handler in the XAML codebehind file and create the new view within the old view.

Any recommendations?

+6  A: 

One way to handle this is to implement a service that provides Views to ViewModels. Views register with the service and ViewModels can request dialogs from the service. This is an example of the Gang of Four mediator pattern.

Jason
A: 

Please see my answer to this question about why the Window class itself is a ViewModel, so you can use it directly from your ViewModel without worries.

Scott Whitlock
A: 

Laurent Bugnion has a weak-referenced mediator, in which he uses it to show dialog messages. Along with the message that is broadcast, a callback delegate is sent for the subscriber to execute. You could use the same concept to show an about dialog. Check out DialogMessage.cs from the source here.

Jeremiah Morrill
A: 

We use Controller classes which are responsible for the UI Workflow. They create the modal windows and they mediate between various ViewModels.

How you can open a modal window with the View-Model-ViewModel (MVVM) pattern is shown in the ViewModel sample application here:

WPF Application Framework (WAF)

http://waf.codeplex.com

jbe
+1  A: 

Take a look at my Modal Dialogs solution for Silverlight 4:

Modal dialogs with MVVM and Silverlight 4

Roboblob