Comment lier le contenu d'un contrôle WPF au DataContext de son conteneur afin de pouvoir appliquer un DataTemplateSelector basé sur cet objet ?
-
15-11-2019 - |
Question
J'essaie de lier une fenêtre WPF au-dessus d'un ViewModel contenant deux collections, A et B.J'essaie d'utiliser DataTemplates pour afficher A ou B en fonction du paramètre d'un indicateur dans mon ViewModel.
À cette fin, j'ai défini la fenêtre DataContext = ViewModel
.Cependant, lorsque j'essaie de lier un ContentControl
à ce DataContext et appliquer un DataTemplateSelector
à cela, le item
paramètre du sélecteur SelectTemplate(object item, DependencyObject container)
la méthode est toujours nulle :
<Window [snip] Title="MainWindow">
<Window.Resources>
<!-- DataTemplate and Selector declarations -->
</Window.Resources>
<Grid>
<ContentControl Content="{Binding}"
ContentTemplateSelector="{StaticResource templateSelector}" />
</Grid>
</Window>
Comment devrais-je lier cela ContentControl
de telle sorte que le ViewModel de la fenêtre soit transmis à son DataTemplateSelector
?
La solution
cela a fonctionné pour moi :
<ContentControl Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
ContentTemplateSelector="{StaticResource templateSelector}" />
Modifier:
Je suis cependant d’accord avec Aaron sur le fait que ce n’est peut-être pas la meilleure façon d’accomplir les choses.Vous avez dit que vous utilisiez un ViewModel.Le moyen le plus simple serait probablement de lier votre ItemsControl à une nouvelle propriété "SelectedCollection" sur votre Viewmodel qui expose la collection souhaitée.Ensuite, dans votre drapeau (en supposant qu'il s'agisse d'une propriété), vous pouvez déclencher la propriété modifiée pour "SelectedCollection".
Autres conseils
Il se passe beaucoup de choses ici...
Vous avez dit que vous utilisiez le DataTemplateSelector
pour afficher la collection A ou la collection B, alors qu'en même temps vous avez déclaré que vous définissez l'une des collections comme DataContext
de la Fenêtre.
Si vous souhaitez masquer les données d'une collection, effectuez un filtrage sur la collection elle-même.Une autre approche consiste à exécuter la liaison via un IValueConverter
ou IMultiValueConverter
.Une autre solution pourrait consister à avoir deux éléments d'interface utilisateur liés respectivement à chaque collection et à modifier le Visiblity
de l'élément d'interface utilisateur en fonction de la valeur dans votre ViewModel.
Beaucoup d'options différentes... et si je vous comprends bien, le DataTemplateSelector
ne devrait pas en faire partie.