Comment puis-je trouver mon élément «CheckBox» dans ItemTemplate?
-
03-07-2019 - |
Question
J'ai le suivant (très simple) ItemsControl:
<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Name="MyCheckBox" Content="{Binding Text}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Dans le code, j'aimerais procéder comme suit:
foreach (var dahCurrentItem in BlahList.Items)
{
var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox")
// I'm going to do something with the check box here...
}
Comment je fais ça?
La solution
Tout d'abord, évitez s'il existe un moyen de l'éviter. Il est beaucoup plus simple de lier les différentes propriétés du CheckBox
à votre modèle de vue plutôt que d'essayer de les extraire manuellement.
Cela dit, si vous devez accéder à votre CheckBox
, vous pouvez utiliser un code comme celui-ci:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;
Autres conseils
OK, Kent obtient le crédit, mais ce n’était que pour la plupart correct:)
// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
mais ... la deuxième partie renverrait null, elle devait donc être comme suit:
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Son code semblait devoir fonctionner, mais dans mon cas, je devais le faire à la place.
Voici un exemple de capture d'un conteneur dans lequel se trouve l'élément de votre 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;
}
}
J'espère que cela aide.
J'ai utilisé le code fourni par Kent et Timothy, mais cette ligne supplémentaire était également nécessaire pour moi.
Tout l'extrait de code va:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Salut!