Utilizzo di un ListBox (o di altri ItemsControl) per ospitare i presentatori Caliburn
-
05-07-2019 - |
Domanda
Se ho un MultiPresenter
e sto usando un ListBox
per visualizzare il Presenters
che sta ospitando, come faccio a scoprire Caliburn e associare le visualizzazioni e visualizzare i modelli per gli articoli?
Ad esempio, se ho una vista semplice che assomiglia a questa:
<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>
Che è associato al CarViewModel
:
public class CarViewModel : MultiPresenter
{
public BindableCollection<IPartViewModel> Parts { get; }
}
E la raccolta Parti
contiene vari oggetti che implementano IPresenter
e hanno viste corrispondenti, ad es. WheelViewModel
e WheelView
e EngineViewModel
e EngineView
.
Vorrei che Caliburn risolvesse le visualizzazioni usando la strategia di visualizzazione. È possibile? Cosa devo fare per impostare correttamente la gerarchia dei presentatori in questo caso?
Soluzione
Non è necessario cambiare la gerarchia dei presentatori per questo. Ti consiglio di prendere in considerazione l'utilizzo della proprietà MultiPresenter.Presenters
per raccogliere ViewModels figlio e i metodi MultiPresenter.Open
e MultiPresenter.Shutdown
se necessario per imporre il ciclo di vita di ViewModels figlio.
Per il problema dell'associazione, è necessario definire il modello per gli elementi ListBox:
<ListBox ItemsSource="{Binding Parts}">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Utilizzando cal: View.Model
, la struttura si occupa della creazione di una vista appropriata per ciascun ViewModel, associandola al ViewModel e iniettandola nel ContentControl.
Dovresti anche assicurarti che il tuo spazio dei nomi e la denominazione della classe per Views e ViewModels seguano il Caliburn convenzione predefinita se si desidera che le proprie viste siano correttamente dedotte dal framework. Altrimenti, devi scrivere un IViewStrategy personalizzato (non è difficile, però).
Modifica: fissa l'espressione di associazione in cal: proprietà View.Model