2010-03-03 3 views
5

Comment puis-je préfixer les valeurs liées dans les contrôles TextBlock d'un StackPanel sans utiliser de contrôles séparés pour les préfixes? Supposons que j'ai une boîte de dialogue qui utilise TreeView pour afficher une liste de livres, avec les nœuds supérieurs comme titre, et un ensemble de nœuds subordonnés pour les autres attributs du livre (ISBN, auteur, etc.) . J'ai la liaison qui fonctionne correctement, mais mon utilisateur veut que la liste des attributs du livre s'empile verticalement, et, évidemment, il veut que chaque noeud d'attribut ait un préfixe descriptif avant la valeur (par exemple, "Auteur: Erich Gamma" à la place juste "Erich Gamma"). Dans mes éléments HDT et DT, j'utilise un contrôle StackPanel et TextBlock pour afficher les valeurs.Question de mise en forme WPF simple

Dois-je utiliser un contrôle TextBlock séparé pour le préfixe de chaque attribut

<!-- Works, but requires 2 controls to display the book author and the prefix stacks above the author --> 
<TextBlock Text="Author: "/><TextBlock Text="{Binding Path=Author}" /> 

ou est-il un moyen de le faire avec un seul contrôle TextBlock pour chaque noeud?

<!-- only one control, but doesn't work --> 
<TextBlock Text="Author: {Binding Path=Author}" /> 

Je sais que cela doit être un problème commun, et je googlé pour elle et cherchai dans les trois livres WPF j'ai, mais je suppose que je ne sais pas la bonne façon de chercher ce que je suis en train dire.

Merci!

Répondre

6

Si vous avez .Net 3.5 SP1, vous pouvez facilement via ce StringFormat achive

<TextBlock Text="{Binding Path=Title, StringFormat= Title: {0}}" /> 

Vous pouvez aussi le faire

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding StringFormat="Author: {0}, Title: {1}"> 
     <Binding Path="Author"/> 
     <Binding Path="Title"/> 
    </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Si vous n'utilisez pas SP1, Ensuite, vous pouvez utiliser un ValueConverter

+0

Votre méthode est plus propre que la mienne :) – slugster

+0

oui..mais cette fonctionnalité n'est présente qu'à partir de 3.5SP1 – SysAdmin

+0

+1, mais vous pouvez fournir une valeur de repli lorsque la liaison échoue ou que la valeur –

2

Méthode rapide et simple: utilisez un convertisseur et transmettez le préfixe comme paramètre du convertisseur. Ensuite, dans le convertisseur, tout ce que vous faites est de préfixer le texte du paramètre du convertisseur au texte de liaison.

<TextBlock Text="{Binding Path=Title, Converter={StaticResource MyTextConverter}, ConverterParameter=Title}" /> 
<TextBlock Text="{Binding Path=ISBNNumber, Converter={StaticResource MyTextConverter}, ConverterParameter=ISBN}" /> 
<TextBlock Text="{Binding Path=AuthorName, Converter={StaticResource MyTextConverter}, ConverterParameter=Author}" /> 

public class MyTextConverter : IValueConverter 
{ 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is string) 
     { 
      return string.Format("{0}{1}{2}", parameter ?? "", !string.IsNullOrEmpty(parameter) ? " : " : "", value); 
     } 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

C'était tout droit du haut de ma tête, excusez toutes les petites erreurs. Cela se fait en utilisant seulement le bloc de texte. Tout ce que vous avez à faire est d'inclure le convertisseur dans les ressources statiques du fichier xaml.

+0

Excellente suggestion. Je soupçonne que je devrais faire cela pour quelque chose de plus sophistiqué que ce que je fais actuellement. Merci! –