Como faço para encontrar meu item de "caixa de seleção" no itemTemplate?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho o seguinte (muito simples) itemsControl:

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

No código, gostaria de fazer o seguinte:

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

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

Como faço isso?

Foi útil?

Solução

Em primeiro lugar, não, se houver alguma maneira de evitá -lo. É muito mais limpo vincular as várias propriedades do CheckBox para o seu modelo de visualização, em vez de tentar puxá -los manualmente.

Dito isto, se você precisar chegar ao seu CheckBox, você pode poder usar o código assim:

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

Outras dicas

Ok, Kent recebe o crédito, mas foi apenas majoritariamente certo :)

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

Mas ... a segunda parte retornaria nulo, então tinha que ser o seguinte:

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

O código dele parecia ter funcionado, mas, para o meu caso, eu tive que fazer isso.

Aqui está um exemplo de captura de um contêiner que abriga o item do seu 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 isso ajude.

Eu usei o código que Kent e Timothy forneciam, mas também era necessária essa linha adicional para mim.

O snippet de código inteiro diz:

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

Felicidades!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top