2010-12-01 24 views
4

Je suis en train de créer un contrôle utilisateur simple; juste un ImageButton.WPF - Problème de liaison Texte d'info-bulle sur le contrôle utilisateur personnalisé

J'ai déjà lié avec succès l'image au bouton et j'ai donc décidé d'ajouter une info-bulle. Maintenant j'ai des problèmes. Il semble que je peux coder en dur le texte pour l'info-bulle dans le XAML pour le contrôle, mais quand il est lié il renvoie une chaîne vide.

Voici le XAML pour mon contrôle:

<Button x:Class="BCOCB.DACMS.Controls.ImageButton" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
     Name="this" 
     Style="{StaticResource DisabledButton}"> 

    <Image Source="{Binding ElementName=this, Path=Source}" />  
    <Button.ToolTip> 
     <TextBlock Text="{Binding ElementName=this, Path=ToolTipText}" /> 
    </Button.ToolTip> 
</Button> 

Et voici l'info propriété de dépendance pour le texte de l'info-bulle:

public static readonly DependencyProperty ToolTipTextProperty = DependencyProperty.Register("ToolTipText", typeof(string), typeof(ImageButton)); 
public string ToolTipText 
{ 
    get 
    { 
    return this.GetValue(ToolTipTextProperty) as string; 
    } 
    set 
    { 
    this.SetValue(ToolTipTextProperty, value); 
    } 
} 

Et, enfin, la déclaration du contrôle dans ma fenêtre:

<controls:ImageButton x:Name="btnAdd" Source="/DACMS;component/Resources/plus.png" ToolTipText="Add New Item" Click="btnAdd_Click" /> 

Comme je l'ai mentionné auparavant, l'image se lie très bien et je l'ai fait exactement la même chose manière.

Des idées?

Merci,
Sonny

EDIT: Je l'ai travaille maintenant. J'ai enlevé le ElementName de la liaison et ai placé le DataContext = this du TextBlock dans le code derrière sur l'instanciation. Pourtant, j'aimerais savoir comment corriger cela dans le XAML, à la place.

Répondre

6

Je suis incapable de tester ce moment, mais vous pouvez essayer:

<Button.ToolTip 
     DataContext=”{Binding Path=PlacementTarget.Parent.Parent, 
        RelativeSource={x:Static RelativeSource.Self}}" 
> 
    <TextBlock Text="{Binding Path=ToolTipText}" /> 
</Button.ToolTip> 

Vous pourriez avoir à expérimenter un peu avec le nombre de « Parent » dans PlacementTarget.

Espérons que cela fonctionne. Je n'aime pas donner des réponses que je n'ai pas testées, mais je n'ai pas de VS sur cet ordinateur. :)

+0

Tout près. Je l'ai compris à la fin, mais je vais vous féliciter pour m'avoir mis sur la bonne voie. J'ai fini par changer '' à ' –

+1

Vous ne pouvez pas mettre DataContext dans

1

J'ai rencontré le même problème avec la liaison à un ContextMenu. Après mes recherches, je pense que c'est parce que le ToolTip et le ContextMenu n'existent pas dans l'arbre visuel de votre page/fenêtre/contrôle. Et donc le DataContext n'est pas hérité et rend la liaison gênante.

Voici un bidouille Xaml que j'ai trouvé qui a fonctionné pour moi.

Binding to a MenuItem in a WPF Context Menu

0

Puisque vous ne modifiez rien d'autre que le texte de l'info-bulle TextBlock, vous pouvez simplement utiliser une déclaration en ligne qui va générer le TextBlock pour vous et ne nécessite aucun piratage pour contourner le problème de portée re courir dans autrement:

<Button ... ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=ToolTipText}">... 

Vous pouvez alternativement régler l'info-bulle sur l'image et utilisez la commande comme le DataContext, qui contourne le problème de la portée du nom. Le DataContext sera transmis à l'info-bulle, ce qui permet une liaison normale:

<Image DataContext="{Binding ElementName=this}" Source="{Binding Source}"> 
    <Image.ToolTip> 
     <TextBlock FontSize="18" Text="{Binding Path=ToolTipText}" /> 
    </Image.ToolTip> 
</Image> 

De cette façon permet des réglages supplémentaires sur le TextBlock ou visuels plus complexes.

1

La façon de définir le contexte de données « ce » par XAML ressemble à ceci:

<Control DataContext={Binding RelativeSource={RelativeSource Self}}> 

Comme un autre point, WPF boutons permettent leur contenu d'être à peu près tout (simple) chose que vous voulez. Si vous voulez quelque chose d'autre que du texte (texte et une image), il ressemble à ceci:

<Button Name="SampleButton" Click="SampleButton_Click"> 
    <Grid Width="70" Height="62"> 
     <Label Content="SampleText"/> 
     <Image Margin="3,3,3,3" Source="Graphics/sample.ico"/> 
    </Grid> 
</Button> 
0

Cette version corrige le problème avec les liaisons info-bulle et Propriétés dépendances:

<UserControl x:Class="Extended.InputControls.TextBoxUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Extended.InputControls" 
    x:Name="UserControl" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <TextBox x:Name="textBox"> 
     <TextBox.ToolTip> 
      <ToolTip Content="{Binding Path=CustomToolTip}" Background="Yellow"/> 
     </TextBox.ToolTip> 
    </TextBox> 
</UserControl> 

Au lieu de cela (ne fonctionne pas):

<UserControl x:Class="Extended.InputControls.TextBoxUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Extended.InputControls" 
    x:Name="UserControl"> 
    <TextBox x:Name="textBox"> 
     <TextBox.ToolTip> 
      <ToolTip Content="{Binding ElementName=UserControl, Path=CustomToolTip}" Background="Yellow"/> 
     </TextBox.ToolTip> 
    </TextBox> 
</UserControl>