2010-11-04 6 views
1

J'ai un objet basé sur le type ContentControl et je veux intégrer des contrôles personnalisés dans son contenu. ci-dessous est le code. Le problème est que j'ai besoin de MyContainer pour avoir une liste d'objets MyControl afin qu'ils puissent communiquer avec eux, et chaque MyControl aura besoin d'une référence à MyContainer.comment lier le conteneur et son contenu?

Comment cela se fait-il correctement? une façon que je vois est de déclarer une propriété attachée sur MyControl et le définir au nom de l'objet MyContainer, mais cela semble redondant parce que les objets MyCOntrol peuvent rechercher l'arborescence visuelle pour trouver le conteneur. Si la recherche est la bonne façon de faire cela, où vais-je placer le code qui fait la recherche? dans le constructeur MyControl?

Merci pour toute entrée konstantin


public class MyContainer : ContentControl 
{ 
... 
} 

public class MyConrol : Control 
{ 
... 
} 

<c:MyContainer> 
    <Grid> 
    <c:MyControl /> 
    </Grid> 
</c:MyContainer> 

Répondre

0

Vous pouvez ajouter la propriété MyControls-MyContainer classe, créer un modèle pour MyContainer une liste en elle (ItemsControl, ListBox ou un autre contrôle de liste), mettez la liste elle-même dans la grille à partir de votre exemple de code, liez la propriété ItemsSource à la propriété MyControls.

Pour obtenir le conteneur pour le contrôle dans XAML, vous pouvez utiliser la liaison avec RelativeSource définie sur FindAncestor.

Si vous avez besoin de trouver un conteneur à partir du code, vous devriez probablement le faire à chaque fois ou mettre en cache la valeur lors de la première utilisation (les contrôles peuvent-ils être déplacés vers un autre conteneur?). Le contructeur n'est pas l'endroit approprié, parce que le premier contrôle est créé et seulement alors il est mis dans l'arbre.

Les propriétés attachées sont définitivement inutiles.

Questions connexes