91

下面的代码有一个简单的绑定,它使用完全相同的绑定表示法将名为 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 Bar”,但是当您将鼠标悬停在 TextBox 上时,工具提示仅显示绑定值,而不是字符串格式的值。有任何想法吗?

4

6 回答 6

165

WPF 中的工具提示可以包含任何内容,而不仅仅是文本,因此它们为您只需要文本的时间提供 ContentStringFormat 属性。据我所知,您需要使用扩展语法:

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

我不能 100% 确定使用嵌套属性中的 ElementName 语法进行绑定的有效性,但 ContentStringFormat 属性正是您要寻找的。

于 2008-10-13T09:45:41.297 回答
26

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

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

它按预期工作。

于 2014-07-31T09:54:28.083 回答
5

正如马特所说,工具提示可以包含任何内容,因此您可以在工具提示中绑定一个 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>

甚至您也可以在 ToolTip 内堆叠一个网格并根据需要布置您的文本。

于 2014-01-13T16:31:06.550 回答
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"/>
于 2012-12-25T22:01:07.100 回答
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>
于 2018-01-10T20:14:07.810 回答
-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>

我更喜欢更简单的语法,就像我原来的问题中的语法一样。

于 2008-10-13T12:18:28.180 回答