2010-08-11 14 views
1

EDIT: J'ai reformulé toute la question.Comment puis-je lier les propriétés de dépendance d'un contrôle personnalisé à partir d'un dictionnaire de ressources défini dans Generic.xaml?

Bonjour à tous,

J'ai un contrôle personnalisé avec des propriétés de dépendance. Dans le fichier Generic.xaml, j'ai un dictionnaire de ressources. Il est un dictionnaire de ressources dans le dictionnaire externe, défini comme ceci:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:MyNamespace"> 

    <!-- This is the dictionary--> 
    <ResourceDictionary x:Name="TheDictionaryImTalkingAbout" . . . > 
    . 
    . 
    . 
    </ResourceDictionary> 
    . 
    . 
    . 

</ResourceDictionary> 

Dans ce dictionnaire de ressources, TheDictionaryImTalkingAbout, je veux lier à une propriété de dépendance de mon contrôle. J'ai essayé le XAML suivant:

<Object x:Key="MyObject" SomeProperty="{Binding MyDependencyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyNamespace:MyControl}}}"/> 

La liaison ne renvoie aucune erreur, cependant, cela ne fonctionne pas. Quelqu'un peut-il me dire comment je suis censé lier mon contrôle parent à partir d'un dictionnaire de ressources qui se trouve dans Generic.xaml?

EDIT: Cette liaison fonctionne, mais seulement pour certaines propriétés. Je suis incapable de lier GradientStop Color à une propriété de dépendance de type couleur. Il a utilisé pour fonctionner quand c'était un UserControl, mais cela ne fonctionne plus maintenant que j'ai créé un contrôle personnalisé. Je ne sais pas pourquoi, mais si vous êtes intéressé, j'ai posé cette question ici:

Why can I no longer bind GradientStop Color to a Dependency Property of my control?

Merci tous ceux qui ont aidé,

Dalal

Répondre

0

J'ai vu la réponse de Wallstreet Programmer. Par conséquent, je ne sais pas si à la fin, la liaison fonctionnera. Mais le problème que vous voyez avec votre liaison est que vous devez déclarer l'espace de noms où se trouve votre UserControl, puis l'utiliser dans la liaison. Ajoutez une déclaration d'espace de nom au-dessus de votre xaml. Si l'espace de noms est « WindowsApplication » alors cela ressemblera suit:

xmlns:local="clr-namespace:WindowsApplication" 

Puis dans la liaison, écrivez

<GradientStop Color="{Binding Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}}}" Offset="0"/> 
+0

Oh ouais, oups. Je vous remercie. Je peux maintenant utiliser mon contrôle comme type ancêtre, mais la liaison ne semble toujours pas fonctionner. Ce n'est pas parce que vous ne pouvez pas accéder à un GradientStop, car comme je l'ai dit dans mon commentaire à Wallstreet Programmer, cela fonctionne dans la version UserControl de mon contrôle. Je pourrais essayer de mettre la liaison dans Generic.xaml au lieu d'un autre fichier. Mais je ne veux pas faire ça. Si vous avez d'autres solutions, ce serait génial. – Dalal

+0

Vous avez répondu à une partie de ma question initiale, alors je suis allé de l'avant et j'ai marqué le vôtre comme étant le bon. – Dalal

0

Vous ne pouvez pas DataBind à un GradientStop, voir How to bind GradientStop Colours or GradientStops Property in Silverlight?

+0

Ce n'est pas nécessairement vrai. Avant de convertir mon projet en CustomControl à partir d'un UserControl (afin de se débarrasser du fichier XAML), la liaison GradientStop fonctionnait parfaitement, en utilisant le même code ci-dessus. Peut-être que cela ne fonctionne pas dans Silverlight, mais fonctionne dans WPF, je ne sais pas. – Dalal

1

Situation dans un ResourceDictionary n'a rien à voir avec la résolution d'un RelativeSource FindAncestor Reliure. La source est résolue à l'exécution après qu'elle devient partie d'un arbre visuel. Il n'y a rien dans le XAML que vous avez posté qui pourrait être utilisé pour diagnostiquer le problème que vous rencontrez. Non apparenté: Qu'est-ce qui vous a amené à déclarer un ResourceDictionary dans un autre ResourceDictionary?

+0

Merci John. Tu as raison. Cela semble être un problème différent de ce que je pensais. J'ai posté quelques détails ici: http://stackoverflow.com/questions/3472932/why-can-i-no-longer-bind-gradientstop-color-to-a-dependency-property-of-my-contro – Dalal

0

Si quelqu'un est intéressé, voilà comment je lie à ma propriété de dépendance à l'intérieur de mon generic.xaml pour un contrôle personnalisé:

Une partie de générique.XAML:

<ContentControl x:Key="MyFooDepProp" 
       Content="{TemplateBinding local:MyControl.MyFoo}"> 
    <!-- ... --> 
    </ContentControl> 

    <!-- ... --> 
    <Style TargetType="ContentControl"> 
     <Setter Property="Content" Value="{TemplateBinding local:MyControl.MyFoo}" /> 

    <!-- ... --> 

Si vous recevez ce message:

membre 'MyFoo' est pas valide car il ne dispose pas d'un nom de type de qualification

La clé est utiliser TemplateBinding et préfixer votre propriété avec le nom du type (comme je l'ai fait: 'local: MyControl.MyFoo')