Timothy Khouri
Timothy Khouri

Reputation: 31865

How do I get find my "CheckBox" item that is in the ItemTemplate?

I have the following (very simple) ItemsControl:

<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Name="MyCheckBox" Content="{Binding Text}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

In code, I would like to do the following:

foreach (var dahCurrentItem in BlahList.Items)
{
    var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox")

    // I'm going to do something with the check box here...
}

How do I do that?

Upvotes: 26

Views: 15883

Answers (4)

mZm
mZm

Reputation: 140

I used the code that Kent and Timothy supplied, but this additional line was also needed for me.

The whole code snippet goes:

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
container.ApplyTemplate()
var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;

Cheers!

Upvotes: 0

Timothy Khouri
Timothy Khouri

Reputation: 31865

OK, Kent gets the credit, but it was only mostly right :)

// This part was good:
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;

but... the second part would return null, so it had to be as follows:

var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox;

His code looked like it should have worked, but for my case, I had to do this instead.

Upvotes: 29

Scott Nimrod
Scott Nimrod

Reputation: 11570

Here's an example of capturing a container that houses your ItemsControl's item:

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

I hope that helps.

Upvotes: 0

Kent Boogaart
Kent Boogaart

Reputation: 178770

Firstly, don't if there's any way you can avoid it. It's much cleaner to bind the various properties of the CheckBox to your view model rather than trying to pull them out manually.

That said, if you need to get to your CheckBox, you can should be able to use code like this:

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement;
var checkBox = container.FindName("MyCheckBox") as CheckBox;

Upvotes: 19

Related Questions