Maison >développement back-end >C++ >Comment puis-je accéder aux contrôles dans les modèles de données XAML ?

Comment puis-je accéder aux contrôles dans les modèles de données XAML ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-07 15:27:411023parcourir

How Can I Access Controls within XAML DataTemplates?

Accès aux contrôles dans les modèles de données XAML : un guide pratique

Accéder directement aux contrôles dans les DataTemplates XAML par leur nom peut être délicat. La nature dynamique des DataTemplates, créant des éléments à la volée, conduit souvent à des conflits de noms. Pour surmonter ce problème, nous devons parcourir l'arborescence visuelle (la structure hiérarchique de tous les éléments de l'interface utilisateur) en utilisant des techniques telles que la classe VisualTreeHelper.

Méthode 1 : Traversée récursive de l'arbre visuel

Une fonction récursive explore efficacement l'arborescence visuelle. Cet exemple montre une méthode AllChildren pour rechercher tous les contrôles enfants :

<code class="language-csharp">public List<Control> AllChildren(DependencyObject parent)
{
    var children = new List<Control>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is Control control)
        {
            children.Add(control);
        }
        children.AddRange(AllChildren(child));
    }
    return children;
}</code>

Cette méthode peut localiser un contrôle par son nom dans l'arborescence visuelle. Par exemple, pour trouver un Image nommé "img1" dans l'élément sélectionné d'un FlipView :

  1. Assurez-vous que MyFlipView.SelectedItem n'est pas nul.
  2. Récupérer le conteneur : var container = MyFlipView.ItemContainerGenerator.ContainerFromItem(MyFlipView.SelectedItem);
  3. Utilisez AllChildren(container) pour obtenir tous les enfants.
  4. Filtrez la liste pour trouver le Image portant le nom "img1".

Méthode 2 : tirer parti de TemplatedParent

Vous pouvez également utiliser la propriété TemplatedParent pour accéder au contrôle parent à partir du DataTemplate. Cette approche nécessite une classe d'assistance :

<code class="language-csharp">public class TemplatedControl<TControl> : ContentControl
    where TControl : FrameworkElement
{
    public TemplatedControl(TControl control)
    {
        Content = control;
    }

    public TControl Child => (TControl)Content;
}</code>

Ensuite, dans votre DataTemplate :

<code class="language-xaml"><datatemplate>
    <templatedcontrol x:Name="myImage">
        <image ... />
    </templatedcontrol>
</datatemplate></code>

Vous pouvez désormais accéder au contrôle Image via la variable myImage depuis le contrôle parent.

Les deux méthodes fournissent des solutions pour accéder aux contrôles nommés dans les DataTemplates, offrant ainsi plus de contrôle sur votre interface utilisateur basée sur les données. Choisissez la méthode qui convient le mieux à votre style de codage et à la structure de votre projet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn