2010-04-28 28 views
1

J'ai créé un contrôle personnalisé pour ImageButton commeProblème liant image propriété de dépendance Source

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Local:ImageButton}"> 
       <StackPanel Height="Auto" Orientation="Horizontal"> 
       <Image Margin="0,0,3,0" Source="{Binding ImageSource}" /> 
       <TextBlock Text="{TemplateBinding Content}" /> 
       </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
    </Setter> 
</Style> 

classe ImageButton ressemble

public class ImageButton : Button 
    { 
     public ImageButton() : base() { } 

     public ImageSource ImageSource 
     { 
      get { return base.GetValue(ImageSourceProperty) as ImageSource; } 
      set { base.SetValue(ImageSourceProperty, value); } 
     } 
     public static readonly DependencyProperty ImageSourceProperty = 
      DependencyProperty.Register("Source", typeof(ImageSource), typeof(ImageButton)); 
    } 

Cependant, je ne suis pas en mesure de lier le ImageSource à l'image : (Ce code est dans l'interface utilisateur du dossier et de l'image est dans le répertoire de ressources)

<Local:ImageButton x:Name="buttonBrowse1" Width="100" Margin="10,0,10,0" 
Content="Browse ..." ImageSource="../Resources/BrowseFolder.bmp"/> 

Mais si je prends une image simple, elle sera affichée si la même source est spécifiée. Quelqu'un peut-il me dire ce qui doit être fait?

Répondre

2

Vous devez remplacer le Binding dans votre ControlTemplate par un TemplateBinding, comme vous l'avez fait pour la propriété Contenu:

<Image Margin="0,0,3,0" Source="{TemplateBinding ImageSource}" /> 

En outre, la définition de votre DependencyProperty est incorrect. La chaîne doit se lire ImageSource au lieu de simplement Source:

DependencyProperty.Register("ImageSource", typeof(ImageSource), ... 

Je ne sais pas si/où ce conflit de nom provoque des problèmes, mais au moins il est fortement recommandé d'utiliser le nom exact de la propriété CLR réelle.

EDIT: Vous devrez aussi changer la TargetType de votre style à votre ImageButton:

<Style TargetType="{x:Type Local:ImageButton}"> 
+0

le conflit du nom provoque des problèmes. –

+0

Le remplacement de la liaison avec TemplateBinding génère une erreur de temps de compilation car Impossible de créer une instance de type 'TemplateBindingExtension'. – Archie

+0

voir mon edit .... – gehho