工具提示上的WPF绑定与StringFormat不起作用

下面的代码有一个简单的绑定,它使用完全相同的绑定符号将名为MyTextBlock的TextBlock的Text绑定到TextBox的Text和ToolTip属性:

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

该绑定还使用.NET 3.5 SP1中引入的StringFormat属性 ,该属性对于上面的Text属性正常工作,但对于ToolTip似乎已被破坏。 预期的结果是“它是:Foo酒吧”,但是当您将鼠标hover在文本框上时,工具提示只显示绑定值,而不是string格式的值。 有任何想法吗?

WPF中的工具提示可以包含任何东西,而不仅仅是文本,所以它们提供了一个ContentStringFormat属性,用于你想要的文本。 就我所知,您将需要使用扩展的语法:

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

我不是100%确定使用像这样的嵌套属性的ElementName语法的绑定的有效性,但ContentStringFormat属性是您正在寻找的。

这可能是一个错误。 当您使用简短的语法工具提示:

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

StringFormat被忽略,但在使用扩展语法时:

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

它按预期工作。

正如马特所说,工具提示可以包含任何内容,所以你可以绑定一个TextBox.Text在你的工具提示。

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

即使您可以在工具提示内部堆叠网格,并根据需要布置文本。

你的代码可以像这样简短:

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

我们将使用事实转换器不会被忽略,不像StringFormat。

把它放到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(); } } } 

把它放到你的ResourceDictionary.xaml中

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

以下是一个罗嗦的解决scheme,但它的工作原理。

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

我宁愿更简单的语法,就像我原来的问题。