web-dev-qa-db-fra.com

La liaison WPF avec StringFormat ne fonctionne pas sur les info-bulles

Le code suivant a une liaison simple qui lie le texte du TextBlock nommé MyTextBlock à la propriété Text et ToolTip de TextBox en utilisant exactement la même notation de liaison:

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox    Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}" />
</StackPanel>

La liaison utilise également la propriété StringFormat introduite avec .NET 3.5 SP1 qui fonctionne correctement pour la propriété Text ci-dessus mais semble être rompue pour l'info-bulle. Le résultat attendu est "Il s'agit de: Foo Bar" mais lorsque vous survolez la TextBox, l'info-bulle affiche uniquement la valeur de liaison, pas la valeur au format chaîne. Des idées?

81
huseyint

Les info-bulles dans WPF peuvent contenir n'importe quoi, pas seulement du texte, elles fournissent donc une propriété ContentStringFormat pour les moments où vous voulez juste du texte. Vous devrez utiliser la syntaxe développée pour autant que je sache:

<TextBox ...>
  <TextBox.ToolTip>
    <ToolTip 
      Content="{Binding ElementName=myTextBlock,Path=Text}"
      ContentStringFormat="{}It is: {0}"
      />
  </TextBox.ToolTip>
</TextBox>

Je ne suis pas sûr à 100% de la validité de la liaison à l'aide de la syntaxe ElementName d'une propriété imbriquée comme celle-ci, mais la propriété ContentStringFormat est ce que vous recherchez.

149
Matt Hamilton

Cela pourrait être un bug. Lorsque vous utilisez une syntaxe courte pour l'info-bulle:

<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" />

StringFormat est ignoré mais lorsque vous utilisez une syntaxe développée:

<TextBox Text="text">
   <TextBox.ToolTip>
      <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/>
   </TextBox.ToolTip>
</TextBox>

Cela fonctionne comme prévu.

21
MuiBienCarlota

Comme Matt l'a dit, l'info-bulle peut contenir n'importe quoi à l'intérieur, donc pour vous, vous pouvez lier un TextBox.Text à l'intérieur de votre info-bulle.

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}">
        <TextBox.ToolTip>
            <TextBlock>
                <TextBlock.Text>
                    <Binding ElementName=MyTextBlock Path="Text" StringFormat="It is: {0}" />
                </TextBlock.Text>
            </TextBlock>
        </TextBox.ToolTip>
    </TextBox>
</StackPanel>

Même vous pouvez empiler une grille dans l'info-bulle et mettre en page votre texte si vous le souhaitez.

4
Lucas Locatelli

Votre code peut être aussi court que celui-ci:

<TextBlock ToolTip="{Binding PrideLands.YearsTillSimbaReturns,
    Converter={StaticResource convStringFormat},
    ConverterParameter='Rejoice! Just {0} years left!'}" Text="Hakuna Matata"/>

Nous utiliserons le fait que les convertisseurs ne sont jamais ignorés, contrairement à StringFormat.

Mettez ceci dans StringFormatConverter.cs:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace TLKiaWOL
{
    [ValueConversion (typeof(object), typeof(string))]
    public class StringFormatConverter : IValueConverter
    {
        public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (ReferenceEquals(value, DependencyProperty.UnsetValue))
                return DependencyProperty.UnsetValue;
            return string.Format(culture, (string)parameter, value);
        }

        public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}

Mettez ceci dans votre ResourceDictionary.xaml:

<conv:StringFormatConverter x:Key="convStringFormat"/>
3
Athari

Dans cette situation, vous pouvez utiliser une liaison relative:

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding Text, RelativeSource={RelativeSource Self}}" />
</StackPanel>