Utilizando uma caixa de listagem (ou outro ItemsControl) a hospedeiras apresentadores Caliburn
-
05-07-2019 - |
Pergunta
Se eu tiver um MultiPresenter
e eu estou usando um ListBox
para exibir o Presenters
é hospedagem, como faço para obter Caliburn para descobrir e ligam os pontos de vista e ver os modelos para os itens?
Por exemplo, se eu tenho uma visão simples que é algo como isto:
<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>
O que é vinculado ao CarViewModel
:
public class CarViewModel : MultiPresenter
{
public BindableCollection<IPartViewModel> Parts { get; }
}
E a coleção Parts
contém vários objetos que implementam IPresenter
e têm vistas correspondentes, por exemplo, WheelViewModel
e WheelView
e EngineViewModel
e EngineView
.
Eu gostaria Caliburn para resolver os pontos de vista para mim usando a estratégia de vista. Isso é possível? O que eu preciso fazer para configurar corretamente a hierarquia dos apresentadores neste caso?
Solução
Você não tem que mudar hierarquia apresentador para isso. Eu só sugiro que você considere o uso da propriedade MultiPresenter.Presenters
a ViewModels criança de coleta e os métodos MultiPresenter.Open
e MultiPresenter.Shutdown
se você precisar impor ViewModels criança ciclo de vida.
Para a emissão de ligação, você deve definir o modelo para os itens de caixa de listagem:
<ListBox ItemsSource="{Binding Parts}">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Usando cal:View.Model
anexado a propriedade, o quadro se encarrega de criar uma visão apropriada para cada ViewModel, ligando-o para o ViewModel e injetá-lo no ContentControl.
Você também deve certificar-se de que o seu namespace e classe de nomeação para Visualizações e ViewModels segue o Caliburn padrão convenção se você deseja que os seus pontos de vista sejam corretamente inferida pela estrutura. Caso contrário, você tem que escrever uma IViewStrategy personalizado (não é difícil, embora).
Editar: expressão de ligação fixo em cal: View.Model propriedade