One ViewModel, multiple views
Asked Answered
C

2

8

I am having a hard time getting multiple views to work against 1 viewmodel. I have read Naming Convention for Multi-View Support without getting much out of it, and have tried countless things in the process.

Just to take a simple example. Say I have a ViewModel for People residing in ShellViewModel, which basically contains a list of Person-objects. I want to display them in two different ways in my application.

enter image description here

What is the correct way to name the Views in this case, and how do I display both views in ShellView?

Click answered 13/9, 2013 at 14:21 Comment(2)
Not sure why the close votes and downvote. Multiple views over a single VM in CM is common.Protohistory
Turn debugging on, it will tell you when it can't find a view and where it looked. Check out View.Context and checkout the HelloScreens example it is an example of multiple views over a single VM.Protohistory
S
8

Anders is correct, there are a number of default conventions for Caliburn.Micro, one of them will locate and display <RootNS>.Views.[<ChildNS>].<ViewTypeName> for <RootNS>.ViewModels.[<ChildNS>].<ViewModelTypeName>.

In your case, for a single View (assuming the classes reside in namespaces derived from the folders):

<RootNS>.Views.PeopleView would by located and displayed for <RootNS>.ViewModels.PeopleViewModel.

For multiple views over the same viewmodel, the convention is that views of format <EntityName>.<Context> are displayed for viewmodels of format <EntityName>[<ViewSuffix>]ViewModel:

From your example, you could create a new folder named People, and inside it, create your views named Grid and List.

Your namespaces become <RootNS>.Views.People.Grid and <RootNS>.Views.People.List and, should then be located and displayed for <RootNS>.ViewModels.PeopleViewModel.

You typically then display the Views in something like a ContentControl, choosing the View you want to display by setting the cal:View.Context property. You'll either hard code the name, if the context isn't going to change in that particular control, or bind to a property which describes what state the ViewModel should be displayed as.

e.g.

<ContentControl cal:View.Model="{Binding Path=ActiveItem}" 
                cal:View.Context="List" />

See the Multiple Views over the Same ViewModel section.

Superpower answered 15/9, 2013 at 22:26 Comment(1)
Glad there was something useful in there :DSuperpower
W
4

As far as I can tell from the documentation you are referring to, you should not use View in your view name. Name your view classes People.Grid and People.List instead.

Wells answered 13/9, 2013 at 16:11 Comment(1)
But, this blog link shows step 2, which specifcally says include ViewModel in the viewmodel's nameKat

© 2022 - 2024 — McMap. All rights reserved.