Как мне найти элемент «CheckBox», который находится в ItemTemplate?

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

  •  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;

Ваше здоровье!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top