¿Cómo consigo encontrar mi artículo "CheckBox" que está en la plantilla de artículo?

StackOverflow https://stackoverflow.com/questions/603203

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo el siguiente (muy simple) ItemsControl:

<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 hago eso?

¿Fue útil?

Solución

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

Dicho esto, si necesita acceder a su CheckBox , debe poder usar un código como este:

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

Otros consejos

Está bien, Kent recibe el crédito, pero solo fue principalmente correcto :)

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

pero ... la segunda parte devolvería el valor nulo, por lo que tenía que ser como sigue:

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

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

Este es un ejemplo de cómo capturar un contenedor que alberga el artículo de 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.

Usé el código que proporcionaron Kent y Timothy, pero esta línea adicional también fue necesaria para mí.

Todo el fragmento de código va:

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;

¡Salud!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top