Como vincular o conteúdo de um controle WPF ao DataContext de seu contêiner para poder aplicar um DataTemplateSelector com base nesse objeto?

StackOverflow https://stackoverflow.com/questions/5036835

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top