2009-03-02 16 views
24

que tiene la siguiente (muy simple) ItemsControl:WPF - ItemsControl - ¿Cómo puedo encontrar mi elemento "CheckBox" que está en el ItemTemplate?

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

En el código, me gustaría hacer lo siguiente:

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

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

¿Cómo se hace eso?

Respuesta

17

En primer lugar, no lo haga si hay alguna manera de evitarlo. Es mucho más claro vincular las diversas propiedades del CheckBox a su modelo de vista en lugar de intentar extraerlas manualmente.

Dicho esto, si usted necesita para llegar a su CheckBox, puede debería ser capaz de utilizar un código como éste:

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

¡Usted señor, es hermoso! - Estoy de acuerdo con su declaración, pero en este caso estoy haciendo una función de tipo "Verificar todos" y "No verificar nada" ... Me doy cuenta de que podría tener el enlace "isChecked" vinculado a alguna matriz, y luego volver a actualizar las vinculaciones ... pero solo buscar y verificar es más lento ... quiero decir ... más fácil :) ¡Gracias de nuevo! –

+2

OK, tuve que quitarme la casilla de verificación "respondida" ... porque solo obtengo "NULO". Me imagino que esto está muy cerca, pero debe faltar algo pequeño. –

+0

¿Qué se debe hacer finalmente para no obtener nulo al hacer el 'FindName'? – J4N

27

bien, Kent se lleva el crédito, pero no fue hasta mayoría derecha:)

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

pero ... la segunda parte volvería nula, por lo que tenía que ser de la siguiente manera:

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

Su código parecía que debería haber funcionado, pero en mi caso, tuve que hacer esto en su lugar.

+1

No tengo un método 'FindName' en ItemTemplate (también parece haber un') 'extra en alguna parte? – J4N

0

He aquí un ejemplo de cómo capturar un recipiente que aloja una pieza de su 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; 
      } 
     } 

Espero que ayude.

Cuestiones relacionadas