2010-03-16 26 views
13

Bien, este es un problema vergonzosamente simple, pero me está volviendo loco. Estoy aprendiendo sobre DataTemplating y estoy tratando de aplicar una plantilla de elemento muy MUY simple a un ListBox.WPF - Muy básico ListBox.ItemTemplate Pregunta

Sin embargo, cuando ejecuto mi aplicación, la plantilla se ignora por completo y obtengo el cuadro de lista de aspecto estándar, mientras que de hecho esperaba ver una lista de casillas con 'Prueba' al costado.

He intentado esto varias veces y siempre el mismo resultado. Revisé varios recursos en Google y todos tengo el mismo tipo de sintaxis para definir y ItemTemplate en un ListBox, así que realmente no puedo ver dónde me estoy equivocando.

Código ...

<Grid x:Name="LayoutRoot"> 
    <ListBox x:Name="TestList" 
     SelectionMode="Multiple"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <CheckBox Content="Check this checkbox!"/> 
        <TextBlock>Test</TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
     <ListBox.Items> 
      <ListBoxItem>Bob</ListBoxItem> 
      <ListBoxItem>Jim</ListBoxItem> 
      <ListBoxItem>Dave</ListBoxItem> 
      <ListBoxItem>Larry</ListBoxItem> 
      <ListBoxItem>Tom</ListBoxItem> 
     </ListBox.Items>    
    </ListBox> 
</Grid> 

Cualquier ayuda muy apreciada. Lo siento por una pregunta tan tonta de apariencia, pero realmente he caído en el primer obstáculo aquí :(

EN

Respuesta

17

no funcionará ItemTemplate cuando se pone ListBoxItem directamente como artículos. Concepto general es que databind una colección CRL a la ListBox.ItemsSource y luego especifique el ItemTemplate Compruebe el código de abajo

<Grid x:Name="LayoutRoot"> 
     <ListBox x:Name="TestList" SelectionMode="Multiple"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <CheckBox Content="Check this checkbox!"/> 
         <TextBlock Text="{Binding}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
      <ListBox.Items> 
       <sys:String>Bob</sys:String> 
       <sys:String>Jim</sys:String> 
       <sys:String>Dave</sys:String> 
       <sys:String>Larry</sys:String> 
       <sys:String>Tom</sys:String> 
      </ListBox.Items> 
     </ListBox> 
    </Grid> 

donde sys es xmlns: sys = "CLR-espacio de nombres: System; montaje = mscorlib"..

de esta manera, hay son 5 ListBoxItems que se generan en th e fondo y agregado a ListBox.

7

Puede usar ItemContainerStyle en lugar de ItemTemplate si desea agregar ListBoxItems directamente al ListBox.

Sin embargo, solo se recomienda cuando necesita características únicas por nivel de artículo.

Si está planeando que todos los artículos tengan el mismo aspecto o una lista dinámica con ItemsSource, le recomendaría que agregue cadenas (u otro objeto personalizado) a su lista y use ItemTemplate para mostrar sus artículos. (Véase la respuesta de Jobi alegría)

Aquí hay un ejemplo usando ItemContainerStyle:

<ListBox 
     x:Name="TestList" 
     SelectionMode="Multiple"> 

     <ListBox.ItemContainerStyle> 
      <Style 
       TargetType="ListBoxItem"> 

       <Setter 
        Property="Template"> 
        <Setter.Value> 
         <ControlTemplate 
          TargetType="ListBoxItem"> 
          <StackPanel> 
           <CheckBox 
            Content="Check this checkbox!" /> 
           <TextBlock 
            Text="{TemplateBinding Content}" /> 
          </StackPanel> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 

      </Style> 
     </ListBox.ItemContainerStyle> 

     <ListBox.Items> 
      <ListBoxItem>Bob</ListBoxItem> 
      <ListBoxItem>Jim</ListBoxItem> 
      <ListBoxItem>Dave</ListBoxItem> 
      <ListBoxItem>Larry</ListBoxItem> 
      <ListBoxItem>Tom</ListBoxItem> 
     </ListBox.Items> 
    </ListBox> 
0

Por alguna razón DataTemplate todavía puede ser ignorado si el cuadro de lista se llena mediante ItemsSource por ejemplo:

<ListBox Name="Test" x:FieldModifier="public" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Tenga en cuenta que este está vinculado a un ObservableCollection que contiene objetos (TextAdapter: INotifyPropertyChanged) con una propiedad: string Text {...}

Cuestiones relacionadas