Utilisation d'un ListBox (ou d'un autre ItemsControl) pour héberger des présentateurs Caliburn
-
05-07-2019 - |
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?
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
Édition: expression de liaison fixe dans cal: propriété View.Model