2009-02-03 14 views
10

Tengo un cuadro de lista y quiero iterar sobre una colección de barras en mi Foo-objeto.¿Cómo vincular correctamente un ListBoxItem en WPF?

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

Esta es la plantilla de datos que quiero usar.

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

Si snoop (-> examinar mediante el uso de la herramienta Snoop) mi solicitud, noto que la totalidad de la colección de barras está obligado a la ContentControl, en lugar de sólo 1.

¿Cómo puedo vincular correctamente para que la iteración sobre la colección vaya bien?

Respuesta

3

Primera añada su espacio de nombres al elemento Window (Intellisense):

xmlns:local="clr-namespace:yourenamespace" 

entonces la siguiente XAML (en Window.Resources es una forma limpia de hacerlo):

<Window.Resources> 

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

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

    </Window.Resources> 

Coloque el Listbox:

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

Pero, d depende de su objeto de código subyacente, debe configurar un constructor para inicializar propiedades públicas dentro de su objeto que son ObservableCollection<> preferiblemente (Hay algunas reglas de restricción con instancia de objeto en XAML).

+0

Implementé esto y no funciona. – Natrium

+1

Le sugiero que escriba su código objeto en su pregunta. Hubo algún error de sintaxis en mi respuesta, lo corrijo (Resource, not Resouce, GridView olvidado, estoy tipeando todo con la mano ...). – belaz

+0

en realidad estoy usando un ListBox. Primero publiqué ListView, pero lo edité. – Natrium

8

Puede simplemente configurar DataTemplate, y WPF hace todo el trabajo. Establezca el ItemsSource en una lista de elementos Bar y luego defina un DataTemplate para Bar elementos.

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

También podría establecer el ItemsTemplate directamente usando <ListBox.ItemTemplate> en lugar de <ListBox.Resources>

Ver Data Binding Overview en MSDN.

+0

el enlace proporcionado parece estar muerto .. – Default

+0

@Default Sí, ese enlace está podrido y no puedo encontrar un reemplazo, lo siento. Era solo un artículo que habla sobre enlaces en WPF. –

Cuestiones relacionadas