2009-10-20 15 views
-1

J'ai un problème probablement simple, que je ne peux pas sembler comprendre:[WPF] ItemsControl pas complètement événement @Loaded chargé

J'ai fait un ItemsControl qui a son datacontext ensemble et montre les données comme paires de Checkboxes et TextBlocks:

<ItemsControl Name="listTaskTypes" Grid.Row="1" Grid.Column="2" Grid.RowSpan="2" ItemsSource="{Binding}" Margin="10,0,0,0" VerticalAlignment="Top" Loaded="listTaskTypes_Loaded"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox Name="checkBoxTypeId" Tag="{Binding Path=TaskTypeID}"/> 
       <TextBlock FontSize="11pt" FontFamily="Helvetica" Text="{Binding Path=Text}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Mon problème est que dans le cas Loaded du ItemsControl, les cases à cocher n'existent pas encore. Comment puis-je obtenir un événement lorsque le ItemsControl est complètement chargé ou n'est-ce pas possible?

+0

Comment savez-vous que les cases à cocher n'existent pas encore? Que voulez-vous faire avec les cases à cocher? –

+0

J'essayais d'obtenir les instances de toutes les cases à cocher afin que je puisse les sélectionner ou non en fonction de certaines conditions dans la base de données. Je l'ai résolu en utilisant l'événement Loaded sur les cases à cocher pour définir l'état des cases individuelles à la place. –

Répondre

0

Le gestionnaire d'événements listTaskTypes.ItemContainerGenerator.StatusChanged peut vous donner la notification sur chaque élément créé dans ItemsControl.

Yeah Loaded est simplement l'événement chargé ItemsControl, les éléments n'ont peut-être pas été créés à ce moment-là. Juste curieux de savoir ce que vous essayez d'atteindre ici. Je suppose que vous essayez d'obtenir l'instance de CheckBox dans le code derrière? Il peut y avoir une meilleure façon d'utiliser la reliure pour réaliser ce que vous cherchez.

+0

Vous avez en effet raison - J'ai fait une méthode qui récupère une instance de toutes les cases à cocher, que j'ai ensuite sélectionné ou non en fonction de certaines conditions dans la base de données. Ces conditions ne sont pas de simples champs vrai/faux, donc je ne sais pas comment faire par liaison. La solution pour moi était de simplement les définir via leur propre événement chargé à la place, puis d'abord les récupérer tous lorsque l'utilisateur appuie sur le bouton Enregistrer à quel point ils existent bien sûr. –

+0

Je crois que la logique pour trouver l'état Checkbox peut vraiment être dans le côté ViewModel et une propriété bool peut être exposée pour lier la case à cocher. Donc, je recommande vraiment d'utiliser MVVM ici et d'éviter le codebehind –

0

Essayez l'événement DataContextChanged! Lorsque le DataContext change, le contrôle doit être Loaded et vous pouvez être sûr qu'il possède également un ensemble DataContext.

Espérons que cela aide