Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the recommended way to open a new window using MVVM in WPF

Hello everyone and thanks in advance for your time.

I'm currently learning MVVM using WPF for a small Biz App that I'm writing. I have read a lot of articles about the MVVM pattern and found that one of the key areas is to decouple the ViewModel from the View as much as possible.

I want to open a new Window in my app but I'm not sure if I should open it from the ViewModel using an ICommand or directly from the view using a standard event. Someone I work with suggested that that I should use commands, but then I thought that this would mean having a reference to a View in my ViewModel, which according to what I understand is precisely what the MVVM pattern focuses on avoiding.

My understanding is that if a window will open for navigation purposes only and the process of opening that new windows has no effect on the Model, then I should keep all of this on the view using standard events.

I know in sw development everything "depends", but guess my question is there a "right"/standard way of doing this?

Best regards, Daniel

like image 597
Daniel Avatar asked Jan 24 '14 19:01

Daniel


People also ask

How do I open a new window in WPF?

You will need to create an instance of a new window like so. var window2 = new Window2(); Once you have the instance you can use the Show() or ShowDialog() method depending on what you want to do. var result = window2.

What framework for MVVM should I use?

Caliburn Micro is a small, yet powerful framework, designed for building applications across all XAML platforms. With strong support for MVVM and other proven UI patterns, Caliburn Micro will enable you to build your solution quickly, without the need to sacrifice code quality or testability.

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.

Do you have to use MVVM with 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.


2 Answers

Yes, VMs should communicate with Views utilizing the Events that Views can subscribe to...

In VM:

public event EventHandler<NotificationEventArgs<string>> DisplayOptionsNotice;  

In View:

private readonly MainViewModel mvm;
...
mvm = DataContext as MainViewModel;
mvm.DisplayOptionsNotice += DisplayOptionsWindow;
...
private void DisplayOptionsWindow(object sender, NotificationEventArgs<string> e)
{
    ...  
    optionsWindow = new OptionsWindow { Owner = this };
    optionsWindow.ShowDialog();
    ...
}
like image 146
Dean Kuga Avatar answered Sep 25 '22 06:09

Dean Kuga


but then I thought that this would mean having a reference to a View in my ViewModel, which according to what I understand is precisely what the MVVM pattern focuses on avoiding.

In general, the way this is handled is via some form of inversion of control. Most MVVM frameworks will provide a service of some form to open a window, and use a Service Locator or Dependency Injection to provide the service to the ViewModel.

This allows your ViewModel to stay decoupled from the specific view rendering framework - you'd pass the service the new VM and say "Show this VM in a window", and that code would be platform specific.

like image 44
Reed Copsey Avatar answered Sep 21 '22 06:09

Reed Copsey