9
votes

Dans WPF, comment DataBind à la fenêtre DataContext de l'intérieur de l'intérieur du type de données d'une liste contenue?

J'ai une fenêtre WPF avec un modèle d'affichage défini comme son DataContext et une liste de liste avec un fichier de données et son itemSource lié au modèle de vue, comme dans l'exemple suivant:

Voir le modèle: < pré> xxx

mainwindow.xaml: xxx

Bien sûr, la propriété TeamName de la classe d'équipe n'est pas affichée dans les éléments de liste de liste car chaque élément de Le LISBOX est le DataContext de la liste.Itemtemplate et remplace le DataContext de la fenêtre.

La question est la suivante: Comment ai-je la base de la propriété TeamName du modèle de vue (fenêtre.dataContext) de l'intérieur La liste de données de la liste de liste?


0 commentaires

4 Réponses :


16
votes

J'extraînerais la déclaration de l: Équipe à la section Window.Resources et référez-la à partir de l'entrée du DataContext et du daTemplate:

<Window x:Class="Example.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:l="clr-namespace:Example" 
    Title="Example" Height="300" Width="300" Name="Main">

 <Window.Resources>
  <l:Team x:Key="data" TeamName="The best team">
   <l:Team.Members>
    <l:Member Name="John Doe" Age="23"/>
    <l:Member Name="Jane Smith" Age="20"/>
    <l:Member Name="Max Steel" Age="24"/>
   </l:Team.Members>
  </l:Team>
 <Window.Resources>

 <Window.DataContext>
     <StaticResource ResourceKey="data"/>
 </Window.DataContext>

 <ListBox ItemsSource="{Binding Path=Members}">
  <ListBox.ItemTemplate>
   <DataTemplate>
    <StackPanel Orientation="Horizontal">
     <TextBlock Text="{Binding Source={StaticResource data}, Path=TeamName}" Margin="4"/>
     <TextBlock Text="{Binding Path=Name}" Margin="4"/>
    </StackPanel>
   </DataTemplate>
  </ListBox.ItemTemplate>
 </ListBox>
</Window>


1 commentaires

+1. Bien sûr! Je n'avais pas pensé à partager le modèle d'opinion comme une ressource. J'essayais de compléter les findings avec Relatifources et Findancestor sans succès.



1
votes

Je créerais un modèle de vue pour un membre de l'équipe, avec une propriété TeamName , quelque chose comme: xxx

alors votre XAML sera aussi propre que dans votre exemple. Avec MVVM, vous ne devriez pas avoir besoin de trucs de liaison exotiques dans la vue. Tout ce dont vous avez besoin devrait être disponible via le modèle de vue.


1 commentaires

Et comment ferais-je les annonces de données?



15
votes

Vous pouvez également utiliser la liaison religieuse, ce n'est pas si compliqué: xxx


0 commentaires

0
votes

Pourquoi ne liez-vous pas votre DataContext à l'équipe, puis faites votre itemSource à l'adresse Team.Members?

Habituellement, j'attribue mon DataContext dans mon codeBeHind mais cela ne devrait toujours pas être antifférent pour vous.

itemSouce = "{chemin de liaison =" Team.Members "}

Je suppose vraiment sa même chose que ce que l'aviade a suggéré. Juste j'ignore DataContext dans My CodeBeHind.


0 commentaires