web-dev-qa-db-fra.com

Comment accéder à un élément d'un modèle de contrôle depuis le code-behind

J'essaie d'accéder à un contrôle utilisateur qui se trouve à l'intérieur du modèle de contrôle d'un contrôle de contenu. Plus précisément:

  <ContentControl x:Name="MyList" >
        <ContentControl.Template>
            <ControlTemplate x:Name="MyControlTemplate">
                <Border RenderTransformOrigin="0,0" x:Name="border">
                    <UserControls:MyControl x:Name="MyControlName" Width="100" ViewModel="{Binding}" />

Je peux accéder à this.MyList mais il dit this.MyControlName est introuvable. Comment puis-je accéder à l'objet MyControlName à partir du code-behind dans cette situation?

Merci!

42
Locksleyu

Vous devez obtenir le modèle et localiser le contrôle par son nom sur le contrôle basé sur un modèle, quelque chose comme:

var template = MyList.Template;
var myControl = (MyControl)template.FindName("MyControlName", MyList);

Les modèles ne sont que cela: des descriptions abstraites de ce qui doit être créé, les contrôles dans les modèles n'existent que dans le contexte de quelque chose qui est en train d'être modelé.


Notez que vous ne devez accéder aux éléments dans un modèle de contrôle que si vous créez le contrôle auquel le modèle est destiné. L'accès depuis l'extérieur doit se faire via des propriétés et des méthodes liées.

Pour modèles de données c'est similaire. Toutes les choses dont vous avez besoin pour accéder doivent être liées à un objet et l'accès doit ensuite se faire via ledit objet. Cela est particulièrement vrai dans le cas des contrôles d'élément qui virtualisent leurs éléments, de sorte que les éléments n'existent même pas la plupart du temps.

75
H.B.

U peut également obtenir le contrôle de chaque modèle en ajoutant un événement Loaded dans le contrôle, puis dans le code, attribuer l'expéditeur de l'événement à une variable.

8
Dawid Jablonski