I’m currently working on a WPF application, it’s my first so I’m learning as I go.
The basics are fine but I’ve hit a problem with what I’m trying to do at the moment. There seem to be tons of ways that might work but I’m pretty sure that I’m going down the path of making it harder than it needs to be.
What I need is some guidance on the simplest way to implement a piece of UI.
I’m using c# 4, wpf and the MVVM pattern.
The data I’m wanting to display looks like this:
obj1 —-< obj2 —-< obj3
i.e. a single obj1 has many obj2’s which has many (specifically 1-3) obj3’s
On my screen, I want to see a list/datagrid type view of the obj2 elements with the associated obj3 elements nested underneath.
The obj2 elements need to show a few text values and a check box (that will fire the appropriate command in the view model when toggled).
The obj3 elements need to show an image, possibly some text and be clickable (again, firing the appropriate command to the view model).
At first I looked at creating a custom control for the obj3 element, a custom control based on ItemsControl for a list of obj3 elements, another custom control for the obj2 element and finally another custom control to display a list of obj2 elements.
However, a little way in, I’ve got the feeling that I’ve massively over-complicated it.
Can I just use user controls? Do I even need them at all or can I just use the regular List control with a template?
Some pointers would be very welcome.
Thanks.
I spent quite some time getting this working as I wanted so thought I’d share…
The answer turned out to be a nested list control with data templates and associated view models for the items in each list. The list control is so much more flexible in WPF than Winforms that you can do pretty much anything with it.
I’ve found many different things that have helped on many different sites but the core details came from Dr.WPF: http://drwpf.com/blog/category/collections/
I won’t post all the code as it’s rather long. The core of it though is to first setup the list view in the user control:
The keys things here are the ItemsPanel and ItemContainerStyle. These define the properties of the panel that contains all list items and the style for each list item respectively.
They are contained in the resources for the user control.
I also have the data templates. The first tells the system to use the second for displaying objects of type Obj2ViewModel
The second data template above contains another list view. This one containing Obj3 items.
The style for these is specified within the DataTemplate’s resources section.
Finally, the User control’s resources also contains the data templates for the Obj3 elements:
Note that the EventToCommand stuff is thanks to the MVVM Light toolkit. It’s not a standard .NET thing.