Comment lier le contenu d'un contrôle WPF au DataContext de son conteneur afin de pouvoir appliquer un DataTemplateSelector basé sur cet objet ?

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

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top