tags:

views:

133

answers:

3
+4  Q: 

WPF MVVM Doubts

Hello fellow StackOverflow users (or Stackoverflowers?):

I'm learning-by-coding WPF. I read several articles/saw several screencasts, and coming from a WEB dev background, I fired up VS2010 and started doing a sample application that would help me learn the basics.

I read some about MVVM too, and started using it. I set up my solution to use WPF 4.0, ActiveRecord 2.1 and SQLite, and everything went kind well. But I still have some doubts:

  • I created a MainWindowViewModel, and am using the RelayCommand class from here to... relay the command. Am I breaking any guidelines by having a MenuItem from the MainWindow to have its command bound to a property of this viewmodel?

  • This action I'm binding the MenuItem command to is going to instantiate a new ViewModel and a new View, and show it. Again, is that ok in the MVVM context?

  • My MainWindow will be a kind of "dashboard", and I will have more than one model attached to this dashboard. Should I just wrap all those models in a single view model?

Something like this:

public class MainWindowViewModel {

    private ObservableCollection<Order> openOrders;
    private Address deliveryAddress;
    private Order newOrder;
    /* Wrappers for the OpenOrders Collection */
    /* Wrappers for Delivery Address */
    /* Wrappers for New Order */
    /* Command Bindings */

}

TIA!

+5  A: 

I created a MainWindowViewModel, and am using the RelayCommand class from here to... relay the command. Am I breaking any guidelines by having a MenuItem from the MainWindow to have its command bound to a property of this viewmodel?

No, you're not breaking any guideline. It's perfectly appropriate to bind the MenuItem to a command of the MainWindowViewModel (where else would you put this command anyway ?)

This action I'm binding the MenuItem command to is going to instantiate a new ViewModel and a new View, and show it. Again, is that ok in the MVVM context?

It's perfectly fine to create a new ViewModel, of course. As for creating a new view, it depends on how you create it... you should of course never instantiate a view explicitly from the ViewModel, because it would introduce a dependency of the VM to the view.

My MainWindow will be a kind of "dashboard", and I will have more than one model attached to this dashboard. Should I just wrap all those models in a single view model?

It depends on what you mean by "wrap"... Your MainWindowViewModel could expose other ViewModels through properties, and theses VMs would be displayed in different parts of the view. If that's what you mean, yes, you should wrap them.

Thomas Levesque
@Thomas thanks for your response. For the second answer, I was thinking exacly about that when asking the question. Assuming I wouldn't explicitly call "new SomeView();", how should I call another view from within a viewmodel? About the third answer, I would need to expose the ViewModels I would need for different parts of the View, and use a UserControl + a ResourceDictionary to render that type, and bind the exposed VM to it?
wtaniguchi
For the 2nd point, I typically use a ContentControl that picks the appropriate DataTemplate based on the type of the viewmodel. For the 3rd: yes, exactly
Thomas Levesque
Ok! Thanks! I think I have a better understanding now, and will work my thoughts around this issues!
wtaniguchi
+1  A: 

Adding to the Thomas answer:

I would create different usercontrols for each part of the dashboard and assign a viewModel to each usercontrol.

Eduardo Molteni
+1  A: 

I created a MainWindowViewModel, and am using the RelayCommand class from here to... relay the command. Am I breaking any guidelines by having a MenuItem from the MainWindow to have its command bound to a property of this viewmodel?

No, that's exactly where you put commands.

This action I'm binding the MenuItem command to is going to instantiate a new ViewModel and a new View, and show it. Again, is that ok in the MVVM context?

It shouldn't need to know how to instantiate a new view; that's the view's job. The specifics of how to do this depend on how you're showing this new view - it could be as simple as having a ContentPresenter in the view that's bound to a property in the view model, so when you set the property (and raise PropertyChanged) the ContentPresenter renders the new object with its related DataTemplate.

Things get a little hinky if by "instantiate a new view" you mean "open a new window." There's not an especially elegant way to do this, especially if you want the new window to be a modal dialog. One way is to add an event handler to the view's code-behind that listens to PropertyChanged on the view model; when the subordinate view model property gets set, the code in the view creates and shows the new window.

My MainWindow will be a kind of "dashboard", and I will have more than one model attached to this dashboard. Should I just wrap all those models in a single view model?

Sure. That's a really common pattern. It's not at all uncommon, for instance, to expose an observable collection property and bind an ItemsControl of some kind to it; the view will automagically create views for every view model you put in that collection. Again, the specific implementation really depends on your application.

Robert Rossney