Как мне найти элемент «CheckBox», который находится в ItemTemplate?
-
03-07-2019 - |
Вопрос
У меня есть следующий (очень простой) ItemsControl:
<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Name="MyCheckBox" Content="{Binding Text}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
В коде я хотел бы сделать следующее:
foreach (var dahCurrentItem in BlahList.Items)
{
var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox")
// I'm going to do something with the check box here...
}
Как мне это сделать?
Решение
Во-первых, не делайте этого, если есть какой-либо способ избежать этого.Гораздо проще связать различные свойства CheckBox
в вашу модель представления, а не пытаться извлечь их вручную.
Тем не менее, если вам нужно добраться до своего CheckBox
, вы можете использовать такой код:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;
Другие советы
Хорошо, Кент получил признание, но это было всего лишь по большей части верно :)
// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
но...вторая часть вернет ноль, поэтому она должна быть следующей:
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Его код выглядел так, как будто он должен был работать, но в моем случае мне пришлось сделать это.
Вот пример захвата контейнера, в котором находится элемент вашего 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;
}
}
Надеюсь, это поможет.
Я использовал код, предоставленный Кентом и Тимоти, но мне также понадобилась эта дополнительная строка.
Весь фрагмент кода выглядит так:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;
Ваше здоровье!