2009-02-03 8 views
10

J'ai une liste et je veux parcourir une collection de barres dans mon objet Foo.Comment lier correctement un ListBoxItem dans WPF?

<ListBox DataContext="{Binding Path=Foo.Bars}" > 
    <ListBox.Items> 
     <ListBoxItem> 
      <ContentControl DataContext="{Binding Path=.}" /> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 

Ceci est le datatemplate que je souhaite utiliser.

<DataTemplate DataType="{x:Type Bar}"> 
     <Label Content="hello stackoverflow" /> 
</DataTemplate> 

Si je snoop (-> examiner en utilisant l'outil Snoop) ma demande, je remarque que la collection des barreaux est lié à la ContentControl, au lieu de seulement 1.

Comment puis-je lier correctement afin que l'itération sur la collection se passe bien?

Répondre

3

D'abord ajoutez votre espace de noms à l'élément Window (IntelliSense):

xmlns:local="clr-namespace:yourenamespace" 

Puis les suivantes XAML (en Window.Resources est une manière propre à le faire):

<Window.Resources> 

     <ObjectDataProvider x:Key="DataProvider" ObjectType="{x:Type local:Foo}"/> 

     <DataTemplate x:Key="Template" > 
      <TextBlock Text="{Binding Bar}"/> 
     </DataTemplate> 

    </Window.Resources> 

Placez le Listbox:

<ListBox DataContext="{Binding Source={StaticResource DataProvider}}" ItemsSource="{Binding Bars}" ItemTemplate="DynamicResource Template" /> 

Mais, il epends sur votre objet code-behind, vous devez définir un constructeur pour initialiser les propriétés publiques au sein de votre objet qui sont de préférence ObservableCollection<> (Il existe certaines règles de restriction avec une instance d'objet dans XAML).

+0

J'ai implémenté ceci, et cela ne fonctionne pas. – Natrium

+1

Je vous suggère de taper votre code objet dans votre question. Il y avait une erreur de syntaxe dans ma réponse, je la corrige (ressource, pas Resouce, GridView oublié, je tape tout avec la main ...). – belaz

+0

en fait j'utilise un ListBox. J'ai d'abord posté ListView, mais j'ai édité cela. – Natrium

8

Vous pouvez simplement définir le DataTemplate, et WPF fait tout le travail. Définissez ItemsSource à une liste d'éléments Bar, puis définissez un DataTemplate pour Bar éléments.

<ListBox ItemsSource="{Binding Path=Foo.Bars}"> 
    <ListBox.Resources> 
     <DataTemplate DataType="{x:Type Bar}"> 
      <Label Content="hello stackoverflow" /> 
     </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 

Vous pouvez également régler directement la ItemsTemplate en utilisant <ListBox.ItemTemplate> au lieu de <ListBox.Resources>

Voir Data Binding Overview à MSDN.

+0

le lien fourni semble être mort .. – Default

+0

@Default Oui, ce lien comme pourri loin et je ne peux pas trouver un remplacement désolé. C'était juste un article sur les liaisons dans WPF. –

Questions connexes