以下代码有一个简单的绑定,它使用完全相同的Binding表示法将名为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>
绑定还使用StringFormat property introduced with .NET 3.5 SP1,它对上面的Text属性工作正常,但似乎在工具提示中被破坏了。预期的结果是“它是:Foo Bar”,但是当您将鼠标悬停在TextBox上时,ToolTip仅显示绑定值,而不是字符串格式化的值。有什么想法吗?
答案 0 :(得分:145)
WPF中的工具提示可以包含任何内容,而不仅仅是文本,因此它们为您只需要文本的时间提供ContentStringFormat属性。据我所知,您需要使用扩展语法:
<TextBox ...>
<TextBox.ToolTip>
<ToolTip
Content="{Binding ElementName=myTextBlock,Path=Text}"
ContentStringFormat="{}It is: {0}"
/>
</TextBox.ToolTip>
</TextBox>
我不是100%确定使用类似嵌套属性的ElementName语法进行绑定的有效性,但是ContentStringFormat属性是您正在寻找的。 p>
答案 1 :(得分:16)
它可能是一个错误。 当您使用工具提示的短语法时:
<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>
它按预期工作。
答案 2 :(得分:4)
正如Matt所说,ToolTip可以包含任何内容,因此您可以在ToolTip中绑定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>
即使您可以在工具提示中堆叠网格并根据需要布置文本。
答案 3 :(得分:3)
您的代码可以简短:
<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"/>
答案 4 :(得分:0)
在这种情况下,您可以使用相对绑定:
<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>
答案 5 :(得分:-7)
以下是一个罗嗦的解决方案,但它有效。
<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>
我更喜欢一种更简单的语法,就像我原来的问题中那样。