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?

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top