Qu'est-ce que le WPF XAML Data Binding equivalent of String.Format?

ou, pour être plus clair, comment puis-je formater un bloc de texte (dans mon cas, à inclure dans un tooltip) de telle sorte que certaines parties du texte proviennent de valeurs liées.

Dans la plaine du C# je voudrais utiliser:

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

cependant le markup WPF XAML pour une propriété de texte semble ne pouvoir contenir qu'une seule reliure. Les lacets bouclés m'ont 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 le Run.Text la propriété n'est pas une propriété de dépendance et ne peut donc pas être lié.

y a-t-il un moyen pour que je puisse réaliser ce formatage dans XAML?

30
demandé sur Drew Noakes 2009-01-15 17:52:47

5 réponses

vous pouvez utiliser Multiving + 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 La Course.Texte-vous ne pouvez pas vous lier à elle, mais il ya quelques solutions de rechange:

44
répondu aku 2009-01-15 15:08:37

Je diviserais en plusieurs blocs de texte, liant chacun avec la chaîne Format={0:P} dans la liaison en tant que telle:

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

Voir ce post pour exemples: de Lester WPF Blog sur StringFormat

Checkout VS2010-la reliure des propriétés inclut le formatage dans les options.

11
répondu Dave 2010-02-09 15:45:06

si vous utilisez 3.5 SP1, la réponse D'Aku est la voie à suivre. Si ce n'est pas le cas, vous pouvez utiliser le FormatConverter de ma bibliothèque WPF Converters .

3
répondu Kent Boogaart 2011-09-27 16:32:39

la façon dont j'ai résolu cela dans le passé est en fait de briser le blocage textuel que vous avez dans votre liste en plusieurs blocages textuels. 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 paramètre, et utiliser un MultiBinding pour lui passer les paramètres. Voir ce lien pour les reliures multiples:

MultiBinding Info

et celui-ci pour information sur les convertisseurs:

Convertisseurs Info

vous pouvez facilement imaginer un convertisseur qui prend" object[] values "au lieu de" object value " comme premier paramètre, et les transmet à la fonction Format.

2
répondu Gabe 2009-01-15 15:14:04

autant que je sache, WPF ne fait pas ce que vous voulez. Vous avez une solution beaucoup plus puissante (bien que plus impliquée).

regardez l'interface IValueConverter .

MSDN HowTo lien ici

MODIFIER

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

jetez un coup d'oeil à la récente série de billets de Phil Haack sur le formatage des chaînes de caractères:

créer un ValueConverter qui prend le format comme une propriété. Vous devriez alors être en mesure de lier votre objet de données et avoir le format basé sur votre format défini (en utilisant nom de la propriété au lieu de la position).

2
répondu Michael Meadows 2009-01-15 18:14:18