31 votes

Qu'est-ce que l'équivalent WPF XAML Data Binding de String.Format?

Ou, pour être plus clair, comment puis-je formater un bloc de texte (dans mon cas, pour être incluses dans une info-bulle) de telle sorte que certaines parties du texte viennent de valeurs soumises.

Dans la plaine, C# je voudrais utiliser:

_toolTip.Text = string.Format("{1:#0}% up, {2:#0}% down",
    Environment.NewLine, percentageOne, percentage2);

Cependant, le XAML WPF balisage d'un Texte de propriété semble pouvoir contenir qu'une seule liaison. Les accolades m'a donné de grands espoirs, mais ce n'est pas possible:

<Element>
  <Element.Tooltip>
    <!-- This won't compile -->
    <TextBlock Text="{Binding Path=PercentageOne}% up, {Binding Path=PercentageTwo}% down"/>
  </Element.Tooltip>
</Element>

J'ai lu que l' Run.Text de la propriété n'est pas une propriété de dépendance et ne peut donc pas être lié.

Est il possible que je peux effectuer cette mise en forme dans le code XAML?

45voto

aku Points 54867

Vous pouvez utiliser MultiBinding + StringFormat (nécessite WPF 3.5 SP1):

 <TextBox.Text>
    <MultiBinding StringFormat="{}{1:#0}% up, {2:#0}% down">
      <Binding Path="PercentageOne" />
      <Binding Path="PercentageTwo"/>
    </MultiBinding>
</TextBox.Text>
 

Concernant Run.Text - vous ne pouvez pas vous y lier mais il existe quelques solutions:

11voto

Dave Points 438

Je diviserais en plusieurs blocs de texte, en liant chacun avec le StringFormat = {0: P} dans la liaison en tant que telle:

 <TextBox Text="{Binding Something, StringFormat=\{0:P\}}" />
 

Voir cet article pour des exemples: Blog WPF de Lester sur StringFormat

Checkout VS2010 - La liaison des propriétés inclut le formatage dans les options.

3voto

Kent Boogaart Points 97432

Si vous utilisez 3.5 SP1, la réponse d'Aku est la voie à suivre. Si vous ne l'êtes pas, vous pouvez utiliser le FormatConverter de ma bibliothèque WPF Converters .

2voto

Michael Meadows Points 15277

Autant que je sache, WPF ne pas faire ce que vous voulez. Vous avez un beaucoup plus puissant (quoique plus impliqués) solution.

Jetez un oeil à la IValueConverter interface.

MSDN HowTo lien ici

MODIFIER

Basé sur aku réponse, et votre affirmation que vous ne pouvez pas utiliser 3.5 SP1, voici une alternative.

Jetez un oeil à Phil Haack récente série de messages sur la chaîne de mise en forme:

Créer un ValueConverter que prend le format en tant que bien. Vous devriez alors être en mesure de lier vos données objet et l'avoir en format basé sur votre format défini (en utilisant le nom de propriété au lieu de la position).

2voto

Gabe Points 1664

La façon dont je l'ai résolu ce problème dans le passé est fait pour briser le TextBlock vous avez dans votre liste en plusieurs TextBlocks. Essayez quelque chose comme ceci:

<Element>
  <Element.Tooltip>
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Path=PercentageOne}"/>
      <TextBlock Text="% up, "/>
      <TextBlock Text="{Binding Path=PercentageTwo}"/>
      <TextBlock Text="% down"/>
    </StackPanel>
  </Element.Tooltip>
</Element>

Alternativement, vous pouvez créer quelque chose comme un StringFormatConverter, qui pourrait prendre la chaîne de format comme un paramètre et utilisez un MultiBinding pour passer les paramètres. Voir ce lien pour MultiBindings:

MultiBinding Info

Et pour info sur les convertisseurs:

Convertisseurs Info

Vous pouvez très facilement imaginer un convertisseur qui prend "object[] valeurs" au lieu de "la valeur de l'objet", comme c'est le premier paramètre, et passe à ceux de la fonction Format.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X