工具提示上的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>
我宁愿更简单的语法,就像我原来的问题。