Pregunta WPF vinculante con StringFormat no funciona en la información sobre herramientas


El siguiente código tiene un enlace simple que vincula el texto del bloque de texto llamado MyTextBlock a la propiedad de texto e información sobre herramientas de TextBox utilizando exactamente la misma notación de enlace:

<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>

El enlace también usa el Propiedad StringFormat introducida con .NET 3.5 SP1 que funciona bien para la propiedad de Texto anterior, pero parece estar roto para la información sobre herramientas. El resultado esperado es "Es: Foo Bar", pero cuando pasa el puntero sobre TextBox, la información sobre herramientas muestra solo el valor de enlace, no el valor de cadena de formato. ¿Algunas ideas?


74
2017-10-13 09:31


origen


Respuestas:


Las sugerencias sobre herramientas en WPF pueden contener cualquier cosa, no solo texto, por lo que proporcionan una propiedad ContentStringFormat para los momentos en que solo desea texto. Necesitarás usar la sintaxis expandida hasta donde yo sé:

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

No estoy 100% seguro de la validez del enlace utilizando la sintaxis de ElementName de una propiedad anidada como esa, pero la propiedad ContentStringFormat es lo que estás buscando.


137
2017-10-13 09:45



Podría ser un error. Cuando utiliza una sintaxis breve para la información sobre herramientas:

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

StringFormat es ignorado pero cuando usa sintaxis expandida:

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

Funciona como se esperaba.


14
2017-07-31 09:54



Como Matt dijo que la información sobre herramientas puede contener algo dentro, entonces podrías vincular un TextBox.Text dentro de la información sobre herramientas.

<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>

Incluso puede apilar una grilla dentro de la información sobre herramientas y diseñar su texto si lo desea.


4
2018-01-13 16:31



Tu código puede ser tan corto como este:

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

Utilizaremos el hecho de que los convertidores nunca se ignoran, a diferencia de StringFormat.

Pon esto en 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();
        }
    }
}

Pon esto en tu ResourceDictionary.xaml:

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

2
2017-12-25 22:01



En esta situación, puede usar el enlace relativo:

<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>

0
2018-01-10 20:14



La siguiente es una solución prolija, pero funciona.

<StackPanel>
  <TextBox Text="{Binding Path=., StringFormat='The answer is: {0}'}">
    <TextBox.DataContext>
      <sys:Int32>42</sys:Int32>
    </TextBox.DataContext>
    <TextBox.ToolTip>
      <ToolTip Content="{Binding}" ContentStringFormat="{}The answer is: {0}" />
    </TextBox.ToolTip>
  </TextBox>
</StackPanel>

Preferiría una sintaxis mucho más simple, algo así como la de mi pregunta original.


-7
2017-10-13 12:18