WPF zone de liste à l'aide de ItemsSource et ItemTemplate
Je suis confus quant à la façon dont les liaisons sont résolus lorsque j'ai à la fois un ItemsSource
et un ItemTemplate
dans un WPF ListBox
.
J'ai un ObservableCollection<int>
appelé ListOfIndexes
. Pour chaque indice, je veux regarder son enregistrement dans une table de base de données. J'espère le faire dans le IndexToObjectDescriptionConverter
.
<ListBox ItemsSource="{Binding ListOfIndexes}"
ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" />
Mais un point d'arrêt dans le convertisseur est de me dire que la valeur lue par l' ItemTemplate
de liaison est de la fenêtre elle-même — c'est à dire, la DataContext
de la ItemsSource
et ItemsTemplate
est le même.
Pardon un peu de sincérité, mais cela semble STUPIDE. Tout le point de la ItemTemplate
est pour le rendu de chaque élément à l'intérieur de la ItemsSource
, donc je suppose que j'ai compris que l' DataContext
de la ItemTemplate
serait l'élément en cours de rendu.
Donc, cela dit, comment dois-je dire à la ItemTemplate
qu'il devrait s'inquiéter de l'individu éléments représentés par les ItemsSource
et de ne pas utiliser la totalité de la fenêtre de DataContext
?
OriginalL'auteur James Cronen | 2014-06-25
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'utiliser un modèle de données pour l'ItemTemplate. C'est ensuite appliquée à chaque élément de la liste
MSDN docs sont ici:
http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplate(v=vs. 110).aspx
La question est à propos du contexte de données étendue. Lorsque vous liez un bien sur la liste, il va utiliser le contexte de données de la zone de liste - c'est pourquoi que le contexte de données est transmis au convertisseur. Si vous définissez un modèle de données à l'intérieur de l'ItemTemplate, il va appliquer ce modèle pour chaque élément dans la liste. Je suppose que basé sur le simple code que vous avez fournis, vous devrez avoir le convertisseur dans le modèle de données:
Dans ce cas, le ContentControl sera affiché pour chaque élément, avec cet élément, comme c'est le contexte de données.
DataTemplate
au sein d'uneItemTemplate
identifie correctement les données du contexte, alors que seulement definding une liaison avec unItemTemplate
utilise le contrôle de la portée. Merci!OriginalL'auteur JimBobBennett
Tout d'abord, je voudrais vous informer que vous avez une bonne lecture de la Les Modèles De Données Vue D'Ensemble page MSDN de sorte que vous pouvez obtenir une meilleure compréhension de cette liaison de données de processus.
C'est votre première erreur. Un
IValueConverter
est responsable de la conversion de données lié valeurs, pas accès aux bases de données. Accéder à vos données dans votre modèle de vue et de remplir les propriétés publiques avec les résultats. Ensuite, les données de lier ces propriétés à des contrôles d'INTERFACE utilisateur dans le code XAML.Seulement à ceux qui ne comprennent pas la situation.
Vous ne dites pas autre chose... il suffit de définir le code XAML correct est assez:
Dans
Resources
:En XAML:
Que c'est.
OriginalL'auteur Sheridan