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.
What is the correct way to name the Views in this case, and how do I display both views in ShellView?
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.
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 namedGrid
andList
.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 aContentControl
, choosing theView
you want to display by setting thecal: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 theViewModel
should be displayed as.e.g.
See the Multiple Views over the Same ViewModel section.