views:

3645

answers:

3

I'm developing a WPF application using the MVVM pattern and I need to display a list of items in a ListView (with filtering), with the fields of the selected item displayed in a Master/Detail view. I'm torn between the following two ways of doing this:

  1. Exposing a CollectionView in my ViewModel, and binding to this.
  2. Exposing a plain IList in my ViewModel, and using CollectionViewSource to create the CollectionView in XAML.

Is there an accepted way of doing this? Any thoughts on the best way?

+4  A: 

I do the former (expose CollectionView from the VM) but what really matters is where your filtering logic is. That should definitely be in the VM so that it can be tested, even if the view has to wire up the CollectionViewSource to the VM. That said, I don't think there's anything particularly nasty or anti-MVVM about exposing a CollectionView from your VM.

HTH, Kent

Kent Boogaart
Do you just create a new CollectionView in the ViewModel? MSDN for CollectionView says you should not be creating a new CollectionView but instead create a CollectionViewSource and get the default view. What's the best way to create a CollectionView?
Cameron MacFarland
MSDN isn't exactly clear about the best way to do it in code. I just create the CollectionView subclass directly (eg. ListCollectionView), but I suppose you could use CollectionViewSource too. My understanding is that CVS just does the selection of the appropriate CV subclass for you and provides XAML support. I haven't had any issues creating the CV myself, and it seems to make sense when you're doing it in code and already know the type of the collection you're wrapping.
Kent Boogaart
Don't forget that WPF automatically creates views for you when you bind...You get a ListCollectionView when you bind to IList for example. This already has TONS of sorting/filtering/grouping functionality but relies on you getting the Items collection of the object you're binding to. Instead, you can use var view = CollectionViewSource.GetDefaultView(yourCollection) as ListCollectionView;. You can do all kinds of cool stuff then.
Stimul8d
A: 

Agree with Kent, def in the VM so it can be tested. Mark

Mark Cooper
+1  A: 

I know I'm a bit late answering your question but I just saw it today.

I have created master/detail viewmodels that use the CollectionViewSource and blogged about it.

I wrote about a viewmodel for master/detail tables here that uses : http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

You can also find a viewmodel for the observablecollection class on my blog pages.

Maybe you find it of use to you.

Robert