2010-03-16 12 views
13

Ok, questo è un problema incredibilmente semplice, ma mi sta facendo impazzire. Sto imparando su DataTemplating e sto provando ad applicare un ItemTemplate molto MOLTO ad un ListBox.WPF - ListBox.ItemTemplate molto elementare Domanda

Tuttavia, quando eseguo la mia app, il modello viene completamente ignorato e ottengo solo la casella di riepilogo standard, mentre in realtà mi piacerebbe vedere un elenco di checkbox con "Test".

Ho provato questo più volte e sempre lo stesso risultato. Ho controllato diverse risorse su Google e tutte hanno lo stesso tipo di sintassi per la definizione e ItemTemplate su un ListBox, quindi non riesco davvero a vedere dove sto andando male.

Codice ...

<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> 

Qualsiasi aiuto molto apprezzato. Ci scusiamo per una domanda così stupida apparentemente, ma ho davvero caduto al primo ostacolo qui :(

AT

risposta

17

ItemTemplate non funzionerà quando si mette ListBoxItem direttamente come oggetti. Generale concetto è che si DataBind una collezione CRL al ListBox.ItemsSource e quindi specificare l'ItemTemplate Controllare il codice qui sotto

<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> 

dove sys è xmlns: sys = "CLR-namespace: System; assemblaggio = mscorlib"..

In questo modo, non ci sono 5 ListBoxItem generati in th e sfondo e aggiunto al ListBox.

7

È possibile utilizzare ItemContainerStyle anziché ItemTemplate se si desidera aggiungere ListBoxItem direttamente a ListBox.

In questo caso, tuttavia, è consigliabile solo quando sono necessarie caratteristiche univoche per livello di articolo.

Se si stanno pianificando tutti gli elementi uguali o si crea un elenco dinamico utilizzando ItemsSource, si consiglia di aggiungere stringhe (o un altro oggetto personalizzato) all'elenco e utilizzare ItemTemplate per visualizzare gli elementi. (Vedi risposta di Jobi Joy)

Ecco un esempio utilizzando 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

Per qualche motivo DataTemplate può ancora essere ignorato se il ListBox è popolato con ItemsSource esempio:

<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> 

Si noti che questo è associato a una ObservableCollection contenente oggetti (TextAdapter: INotifyPropertyChanged) con una proprietà: stringa Testo {...}