2009-11-08 7 views
3

J'ai un simple produit de classe et un UserControl nommé ProductSummaryControl. ProductSummaryControl affiche les détails d'une classe de produit transmise à son DataContext. J'ai vérifié que cela fonctionne quand j'ai mis en place le contrôle et sa propriété manuellement.UserControl lié aux données dans ListBox.ItemTemplate

Je rencontre un problème lorsque j'essaie d'utiliser le ProductSummaryControl dans le cadre d'un ListBox ItemTemplate. Voici le code correspondant:

<ListBox x:Name="ProductsList" HorizontalContentAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <local:ProductSummaryControl DataContext="{Binding}" HorizontalAlignment="Stretch"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Je mis le ItemsSource ListBox à une liste et je vois plusieurs instances de ma ProductSummaryControl qui correspondent au nombre de produits dans la liste, mais les contrôles ne sont pas correctement lié aux données . Tous les exemples que j'ai trouvé de personnalisation ItemTemplate sur le web suggèrent que {} est Binding la façon correcte pour obtenir la valeur de l'article, mais je suis apparemment manque quelque chose ...

MISE À JOUR:

I J'ai fait un peu plus de recherche et j'ai découvert que le DataContext de ProductSummaryControl est défini sur une instance par défaut de Product(). Je pense que cela est à cause de cela:

<UserControl.Resources> 
    <DBSchmid_Data:Product x:Key="ProductDataSource" d:IsDataSource="True"/> 
</UserControl.Resources> 
<UserControl.DataContext> 
    <Binding Mode="OneWay" Source="{StaticResource ProductDataSource}"/> 
</UserControl.DataContext> 

Cela a été causé par la mise en place DataContext dans le mélange afin que les différents éléments du contrôle peuvent référencer des propriétés du DataContext hérité du UserControl. J'ai vérifié que je pouvais modifier la valeur de DataContext à partir d'une méthode de clic sur un bouton et que la liaison fonctionnait correctement, alors j'ai pensé que cela fonctionnerait également avec une liaison via un modèle. Apparemment, les deux cas sont traités différemment, mais je ne comprends toujours pas comment.

+0

Cela fonctionne pour moi. Pourriez-vous décrire comment ça va mal? Voyez-vous des erreurs de liaison dans la fenêtre Sortie lorsque vous l'exécutez sous le débogueur? – itowlson

Répondre

0

est peut-être un problème avec la façon dont vous structuré votre ProductSummaryControl, parce que même si vous ne mettez pas {} Binding DataContext va se hérité automatiquement au contrôle

1

j'ai finalement eu la chance de se battre avec ce plus et l'a fait fonctionner. J'ai dû supprimer le StaticResource, car il interférait avec la définition du DataContext du ProductSummaryControl. Je ne comprends toujours pas pourquoi, mais la suppression de la ressource a permis à la liaison de se produire. J'ai également dû pointer le DataContext à la propriété Content du ContentPresenter possédant le contrôle basé sur un modèle.

<DataTemplate> 
    <local:ProductSummaryControl DataContext="{TemplateBinding Content}" 
           HorizontalAlignment="Stretch"/> 
</DataTemplate>