Pregunta

Si tengo un MultiPresenter y estoy usando un ListBox para mostrar los Presenters que aloja, ¿cómo puedo hacer que Caliburn lo descubra? y enlazar las vistas y modelos de vista para los elementos?

Por ejemplo, si tengo una vista simple que se parece a esto:

<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>

Que está vinculado al CarViewModel :

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

Y la colección Parts contiene varios objetos que implementan IPresenter y tienen las vistas correspondientes, por ejemplo. WheelViewModel y WheelView , y EngineViewModel y EngineView .

Me gustaría que Caliburn resuelva las vistas por mí usando la estrategia de visualización. es posible? ¿Qué debo hacer para configurar correctamente la jerarquía de presentadores en este caso?

¿Fue útil?

Solución

No tienes que cambiar la jerarquía del presentador para esto. Solo te sugiero que consideres utilizar la propiedad MultiPresenter.Presenters para recopilar ViewModels secundarios y los métodos MultiPresenter.Open y MultiPresenter.Shutdown si necesitas para hacer cumplir el ciclo de vida de los ViewModels secundarios.

Para el problema de enlace, debe definir la plantilla para los elementos de ListBox:

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

Usando la propiedad adjunta cal: View.Model , el marco se encarga de crear una Vista apropiada para cada ViewModel, vincularla a ViewModel e inyectarla en el ContentControl.

También debe asegurarse de que su nombre de espacio de nombres y clase para Views y ViewModels siga a Caliburn convención predeterminada si desea que el marco genere correctamente sus Vistas. De lo contrario, tienes que escribir una IViewStrategy personalizada (aunque no es difícil).


Editar: expresión de enlace fija en cal: propiedad View.Model

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top