Utilisation d'un ListBox (ou d'un autre ItemsControl) pour héberger des présentateurs Caliburn

StackOverflow https://stackoverflow.com/questions/1807630

Question

Si j'ai un MultiPresenter et que j'utilise un ListBox pour afficher le Présentateurs qu'il héberge, comment puis-je demander à Caliburn de le découvrir et lier les vues et voir les modèles pour les éléments?

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>

Qui est lié au CarViewModel :

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

Et la collection Parts contient divers objets qui implémentent IPresenter et ont des vues correspondantes, par exemple. WheelViewModel et WheelView et EngineViewModel et EngineView .

J'aimerais que Caliburn résolve les vues pour moi en utilisant la stratégie d'affichage. Est-ce possible? Que dois-je faire pour configurer correctement la hiérarchie des présentateurs dans ce cas?

Était-ce utile?

La solution

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

Pour le problème 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>

En utilisant la propriété attachée cal: View.Model , le framework se charge de créer une vue appropriée pour chaque ViewModel, de la lier au ViewModel et de l'injecter dans le ContentControl.

Vous devez également vous assurer que la dénomination de votre espace de noms et de votre classe pour Views et ViewModels suit le convention par défaut si vous souhaitez que vos vues soient correctement inférées par la structure. Sinon, vous devez écrire une IViewStrategy personnalisée (ce n’est pas difficile, cependant).

Édition: expression de liaison fixe dans cal: propriété View.Model

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top