2009-02-03 7 views
10

Ich habe eine Listbox und ich möchte über eine Sammlung von Bars in meinem Foo-Objekt iterieren.Wie binden Sie ein ListBoxItem in WPF ordnungsgemäß?

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

Dies ist die Datatemplate, die ich verwenden möchte.

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

Wenn ich Schnüffler (-> prüfen, indem das Werkzeug Snoop verwenden) meine Anwendung, merke ich, dass die gesamte Kollektion der Bars an den Content gebunden ist, anstelle von nur 1.

Wie kann ich richtig binden, damit die Iteration über die Sammlung geht?

Antwort

3

Zuerst fügen Sie Ihren Namensraum zum Window Elemente (Intellisense):

xmlns:local="clr-namespace:yourenamespace" 

Dann wird die folgende XAML (in Window.Resources eine saubere Art und Weise ist, es zu tun):

<Window.Resources> 

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

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

    </Window.Resources> 

Platz die Listbox:

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

Aber es d Abhängig von Ihrem Code-Behind-Objekt müssen Sie einen Konstruktor setzen, um öffentliche Eigenschaften in Ihrem Objekt zu initialisieren, die vorzugsweise ObservableCollection<> sind (Es gibt einige Einschränkungsregeln mit Objektinstanz in XAML).

+0

Ich habe dies implementiert, und es funktioniert nicht. – Natrium

+1

Ich empfehle Ihnen, Ihren Objektcode in Ihre Frage einzugeben. Es gab einen Syntaxfehler in meiner Antwort, ich korrigiere es (Resource, nicht Resouce, GridView vergessen, ich tippe alles mit der Hand ...). – belaz

+0

tatsächlich verwende ich eine ListBox. Ich habe zuerst ListView gepostet, aber ich habe das bearbeitet. – Natrium

8

Sie können einfach das DataTemplate festlegen, und WPF erledigt die ganze Arbeit. Legen Sie die ItemsSource zu einer Liste der Bar Elemente fest, und definieren Sie dann ein DataTemplate für Bar Elemente.

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

Sie auch die ItemsTemplate direkt einstellen könnte durch die Verwendung <ListBox.ItemTemplate> statt <ListBox.Resources>

Siehe Data Binding Overview auf MSDN.

+0

der Link zur Verfügung gestellt scheint tot zu sein .. – Default

+0

@Default Ja, diese Verbindung als verrottet und ich kann keinen Ersatz finden Entschuldigung. Es war nur ein Artikel über Bindungen in WPF. –