2009-11-27 23 views
4

Si j'ai un MultiPresenter et je me sers d'un ListBox pour afficher la Presenters qu'il héberge, comment puis-je Caliburn pour découvrir et lier les vues et les modèles de vue pour la articles?L'utilisation d'un ListBox (ou autre ItemsControl) pour accueillir les présentateurs Caliburn

Par exemple, si j'ai une vue simple qui ressemble à ceci:

<UserControl x:Class="MyProject.Views.CarView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ListBox ItemsSource="{Binding Parts}" /> 
    </Grid> 
</UserControl> 

Ce qui est lié à la CarViewModel:

public class CarViewModel : MultiPresenter 
{ 
    public BindableCollection<IPartViewModel> Parts { get; } 
} 

Et la collection Parts contient divers objets qui mettent en œuvre IPresenter et ont des vues correspondantes, p.ex. WheelViewModel et WheelView, et EngineViewModel et EngineView. Je voudrais que Caliburn résolve les vues pour moi en utilisant la stratégie de vue. Est-ce possible? Que dois-je faire pour configurer correctement la hiérarchie des présentateurs dans ce cas?

Répondre

8

Vous n'avez pas besoin de modifier la hiérarchie du présentateur pour cela. Je vous suggère uniquement d'utiliser la propriété MultiPresenter.Presenters pour collecter des ViewModels enfants et les méthodes MultiPresenter.Open et MultiPresenter.Shutdown si vous devez appliquer le cycle de vie des ViewModels enfants.

Pour la question de liaison, vous devez définir le modèle pour les éléments ListBox:

<ListBox ItemsSource="{Binding Parts}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ContentControl cal:View.Model="{Binding}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

L'utilisation cal:View.Model propriété attachée, le cadre prend en charge la création d'une vue appropriée pour chaque ViewModel, le liant à la ViewModel et l'injecter dans le ContentControl.

Vous devez également vous assurer que votre nom d'espace de noms et de classe pour Views et ViewModels suit le calibre default convention si vous souhaitez que vos vues soient correctement déduites par le framework. Sinon, vous devez écrire une IViewStrategy personnalisée (ce n'est pas difficile, cependant).


Edit: expression de liaison fixe cal: View.Model propriété

+2

Je pense que le ContentControl correct ressemble à ceci: GraemeF

+0

Vous avez raison. En fait, le point est superflu. Désolé pour l'erreur, et merci de l'avoir signalé. –