Como vincular o conteúdo de um controle WPF ao DataContext de seu contêiner para poder aplicar um DataTemplateSelector com base nesse objeto?
-
15-11-2019 - |
Pergunta
Estou tentando vincular uma janela WPF sobre um ViewModel que contém duas coleções, A e B.Estou tentando usar DataTemplates para exibir A ou B, dependendo da configuração de um sinalizador em meu ViewModel.
Para esse fim, configurei a janela DataContext = ViewModel
.No entanto, quando tento vincular um ContentControl
para esse DataContext e aplicar um DataTemplateSelector
para isso, o item
parâmetro do seletor SelectTemplate(object item, DependencyObject container)
o método é sempre nulo:
<Window [snip] Title="MainWindow">
<Window.Resources>
<!-- DataTemplate and Selector declarations -->
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource templateSelector}" />
</Grid>
</Window>
Como devo vincular isso ContentControl
de modo que o ViewModel da janela seja passado para seu DataTemplateSelector
?
Solução
isso funcionou para mim:
<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContentTemplateSelector="{StaticResource templateSelector}" />
Editar:
Concordo com Aaron, porém, que esta pode não ser a melhor maneira de realizar as coisas.Você disse que está usando um ViewModel.A maneira mais fácil provavelmente seria vincular seu ItemsControl a uma nova propriedade "SelectedCollection" em seu Viewmodel que expõe a coleção desejada.Então, no seu sinalizador (supondo que seja uma propriedade), você pode disparar a propriedade alterada para "SelectedCollection".
Outras dicas
Muitas coisas acontecendo aqui...
Você disse que está usando o DataTemplateSelector
para exibir a coleção A ou a coleção B, enquanto ao mesmo tempo você declara que está definindo uma das coleções como a DataContext
da Janela.
Se você deseja ocultar os dados em uma coleção, execute a filtragem na própria coleção.Outra abordagem é executar a ligação através de um IValueConverter
ou IMultiValueConverter
.Ainda outra solução poderia ser ter dois elementos de UI vinculados a cada coleção, respectivamente, e alterar o Visiblity
do elemento UI com base no valor em seu ViewModel.
Muitas opções diferentes...e se bem entendi, o DataTemplateSelector
não deveria ser um deles.