2010-11-28 9 views
0

Existe-t-il un moyen de transmettre des paramètres à un dictionnaire de ressources? Je pense que je peux attacher un code derrière dans le but de spécifier des gestionnaires d'événements, mais malheureusement, j'ai également besoin d'accéder à une référence au contrôle parent à partir des gestionnaires d'événements. Le codebehind, je crois, peut être attaché en spécifiant un attribut x: Class pour le dictionnaire de ressources dans xaml, puis en créant une classe dans le même dossier, dont le nom de fichier est quelque chose comme [nom du dictionnaire de ressources] .xaml.cs.Wpf: Transmission des paramètres à un ResourceDictionary

Le but est de séparer le code de quatre modèles de données hiérarchiques que j'utilise dans un seul contrôle treeview. Le xaml de l'arborescence devient un peu long et moche à regarder, alors j'espérais le décomposer en quatre dictionnaires de ressources. Toutes les pensées sont les bienvenues!

Andrew

Répondre

0

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?

+0

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

1

Vous savez que vous pouvez merge your Resource Dictionaries et référencer le DataTemplate dans ces dictionnaires, au besoin, dans le TreeView.

+0

Notez que les clés ne peuvent pas être dupliquées dans un seul ResourceDictionary. Vous ne pouvez donc pas avoir un style avec la même clé dans les deux ressources qui fusionnent en un dictionnaire de ressources plus important. Pas vraiment pertinent mais digne d'être mentionné. – basarat

Questions connexes