2009-03-02 10 views
24

Ho il seguente (molto semplice) ItemsControl:WPF - ItemsControl - Come posso trovare la mia voce "CheckBox" che si trova in ItemTemplate?

<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Name="MyCheckBox" Content="{Binding Text}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

In codice, vorrei fare quanto segue:

foreach (var dahCurrentItem in BlahList.Items) 
{ 
    var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox") 

    // I'm going to do something with the check box here... 
} 

Come posso fare?

risposta

17

In primo luogo, non farlo se esiste un modo per evitarlo. È molto più pulito associare le varie proprietà di CheckBox al modello di visualizzazione piuttosto che provare a estrarle manualmente.

Detto questo, se è necessario per raggiungere la vostra CheckBox, è possibile dovrebbe essere in grado di utilizzare il codice come questo:

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement; 
var checkBox = container.FindName("MyCheckBox") as CheckBox; 
+0

Lei signore, sono bellissime! - Sono d'accordo con la tua affermazione, ma in questo caso sto facendo una funzione di tipo "Check All" e "Check None" ... Mi rendo conto che potrei avere il "isChecked" associato a qualche array, e quindi aggiornare nuovamente i binding ... ma solo riprendere e controllare è più pigro ... voglio dire .. più facile :) Grazie ancora! –

+2

OK, ho dovuto togliere la casella di controllo "risposta" ... perché sto ricevendo solo "NULL". Immagino che questo sia molto vicino, ma ci deve essere qualcosa di piccolo mancante. –

+0

Cosa si dovrebbe fare infine per non ottenere nulla quando si esegue il 'FindName'? – J4N

27

OK, Kent ottiene il credito, ma è stato solo principalmente destra:)

// This part was good: 
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement; 

ma ... la seconda parte ritornerebbe nullo, così doveva essere come segue:

var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox; 

Il suo codice sembrava che avrebbe dovuto funzionare, ma per il mio caso, ho dovuto farlo invece.

+1

Non ho un metodo 'FindName' su ItemTemplate (sembra che ci sia anche un') 'da qualche parte? – J4N

0

Ecco un esempio di catturare un contenitore che ospita voce del tuo ItemsControl:

 CheckBox checkbox = sender as CheckBox; 

     foreach (var item in MembersItemsControl.Items) 
     { 
      var container = 
MembersItemsControl.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement; 

      UserInformation user = container.DataContext as UserInformation; 

      bool isMale = true; 
      if (user.sex == isMale && checkbox.IsChecked.Value == true) 
      { 
       container.Visibility = System.Windows.Visibility.Visible; 
      } 
     } 

Mi auguro che aiuta.

Problemi correlati