Les dictionnaires de ressources semblent être une manière un peu particulière de le faire. Les dictionnaires de ressources concernent uniquement le partage d'instances: ils vous permettent d'utiliser une instance unique de quelque chose (par exemple un style, un modèle, un pinceau ou autre) à partir de plusieurs endroits. Ils ne sont pas vraiment un mécanisme pour diviser votre interface utilisateur pour simplifier les fichiers Xaml individuels.
Le mécanisme habituel permettant de fractionner des fichiers Xaml trop compliqués en quelques fichiers plus petits et plus faciles à gérer est le contrôle utilisateur. (Le dictionnaire de ressources fusionne entre en jeu lorsque vous avez déjà un dictionnaire de ressources et qu'il est trop volumineux, mais vous n'introduireiez normalement pas de dictionnaire de ressources pour commencer à scinder les choses, bien au contraire. grands fichiers Xaml, c'est pourquoi la fusion de dictionnaire a dû être inventée en premier lieu!)
La plupart du temps, quand je définis un gabarit de données, je le fais contenir seulement un contrôle d'utilisateur simple. Et si cela devient plus complexe, je diviserais ce contrôle utilisateur en plusieurs contrôles utilisateur. D'après votre description, il semble que votre fichier Xaml soit devenu volumineux car vous disposez de quatre grands modèles de données hiérarchiques. Si vous avez pris le corps de chaque modèle et l'a transformé en un contrôle utilisateur, vos quatre modèles seraient désormais très simple - quelque chose comme ceci:
<HierarchicalDataTemplate x:Key="t1" ItemsSource="{Binding Path=Children}">
<loc:TreeItemTypeOne />
</HierarchicalDataTemplate>
et vous auriez pas très probablement plus besoin de mettre ces modèles en fichiers séparés. Mais parce que le courage de chaque modèle est maintenant dans un contrôle utilisateur, cela vous donne une place pour mettre votre codebehind.
Vous mentionnez avoir besoin d'une référence au contrôle parent. Cela m'inquiète - cela donne l'impression que vous avez trop de code dans votre codebehind. Mais une chose à la fois ... Vous pourriez résoudre ce problème en définissant une propriété de dépendance appelée ParentControl sur votre contrôle utilisateur, puis mettre ceci dans le modèle:
<loc:TreeItemTypeOne
ParentControl="{Binding RelativeSource=
{RelativeSource AncestorType=loc:ParentControlType}}" />
Mais franchement, dès que je me trouve dans une position où j'ai besoin de cela, je me demande: comment je me suis mis dans une position où cela semblait nécessaire, et que puis-je faire pour résoudre ce problème?
Merci Ian, c'est une réponse géniale.La raison pour laquelle j'ai tellement de problèmes avec le codebehind est due à la fonctionnalité glisser-déposer. Chaque modèle de données hiérarchique possède un panneau de pile qui peut être déplacé vers un autre élément de l'arborescence. Je dois essayer de mettre en œuvre ceci avant de marquer votre réponse correcte, mais je serai de retour. Il m'aurait fallu une éternité pour arriver à ces conclusions! Très bonne réponse! – Andrew