Como faço para encontrar meu item de "caixa de seleção" no itemTemplate?
-
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?
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!