WPF-ItemsControl-Comment puis-je trouver mon élément "CheckBox" qui se trouve dans ItemTemplate?
J'ai le ItemsControl suivant (très simple):
<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Name="MyCheckBox" Content="{Binding Text}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Dans le code, je voudrais faire ce qui 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 puis-je faire ça?
3 réponses
Tout d'abord, ne le faites pas s'il y a un moyen de l'éviter. Il est beaucoup plus propre 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 avez besoin d'accéder à votre CheckBox
, vous pouvez pouvoir utiliser du code comme ceci:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;
OK, Kent obtient le crédit, mais c'est seulement plupart raison :)
// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
Mais... la deuxième partie retournerait null, donc elle devait être comme suit:
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Son code semblait qu'il aurait dû fonctionner, mais pour mon cas, je devais le faire à la place.
Voici un exemple de capture d'un conteneur qui abrite 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.