2011-12-21 5 views
0

Je crée un contrôle WPF personnalisé qui utilise une image à l'intérieur de celui-ci. Ce contrôle personnalisé sera comme n'importe quel autre, il sera déclaré dans xaml. Je veux avoir une propriété publique pour ce contrôle pour spécifier la source de l'image interne, de la même façon que vous le faites lors de l'utilisation d'un contrôle de l'image:Définition des propriétés d'un contrôle dans xaml

<Image Source="http://foo.com/bar.jpg"></Image> 

Ce que je veux faire est d'avoir l'utilisation suivante mon contrôle:

<MyCustomControl ImageSource="http://foo.com/bar.jpg"></MyCustomControl> 

Et puis à l'intérieur, quelque chose comme:

<UserControl class="MyCustomControl" ...> 
    <Image Source="{Binding Imagesource}"></Image> 
</UserControl> 

Quel genre de configuration ai-je besoin dans mon codebehind pour que cela fonctionne? J'ai essayé quelques petites choses mais je n'ai rien à faire.

+0

Demandez-vous comment créer 'ImageSource'? Si oui, vous cherchez un DependencyProperty. Ou demandez-vous comment lier DependencyProperty à un contrôle encapsulé? – MBirchmeier

Répondre

2

Ce que vous avez besoin est un dependency property de type ImageSource et une bonne liaison, soit utiliser ElementName ou RelativeSource, ne pas utiliser le DataContext sur UserControls.

<UserControl Name="control" x:Class="MyCustomControl" ...> 
    <Image Source="{Binding ImageSource, ElementName=control}"/> 
</UserControl> 

<UserControl x:Class="MyCustomControl" ...> 
    <Image Source="{Binding ImageSource, 
          RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
</UserControl> 
+0

juste par curiosité - qu'est-ce qui se passe avec l'utilisation de DataContext avec les contrôles de l'utilisateur? –

+1

@Dmitry: Vous vous attendez généralement à ce qu'un DataContext soit hérité à moins d'être explicitement défini, le problème est que lorsque DataContext est défini dans UserControl, il n'est * pas visible * sur l'instance et les liaisons échouent de façon inattendue. –

+0

Assez curieusement, cela a fonctionné dans mon application Silverlight, mais pas mon application WPF. Une idée pourquoi? – PhilBrown

Questions connexes