WPF与StringFormat的绑定不适用于工具提示


87

下面的代码具有一个简单的绑定,该绑定使用完全相同的绑定符号将名为MyTextBlock的TextBlock的文本绑定到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上时,工具提示仅显示绑定值,而不显示字符串格式的值。有任何想法吗?


3
我是不是能够得到以下工作建议的解决方案的任何,但是这一次做的:stackoverflow.com/questions/4498649/...
17 26

Answers:


156

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

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

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


1
我知道,我认为ToolTip只是Windows窗体中的纯字符串。是的,在这种情况下ElementName语法无法访问外部元素。
huseyint

9
请注意,仅当将{0}放在字符串开头时才需要{},因此您需要使用它来区别其他xaml标记。
Shimmy Weitzhandler,2009年

5
头脑=吹牛。我刚打完这个就像“ waaaat?”

2
当没有指定转换器时,stringformat不能“正常工作”确实使我感到震惊。我必须编写自己的stringformatConverter。MS再次丢球……
Gusdor

3
StringFormat仅在TargetType字符串类型为is时应用。ToolTip内容为类型object
Johannes Wanzek

22

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

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

它按预期工作。


最准确的答案..谢谢!
阿米尔·马赫迪·纳西里

5

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

您的代码可以如下所示:

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

虽然我更愿意选择最佳答案,但ElementBinding问题使我震惊。这个答案适用于我的情况,其他人则没有。
Reginald Blue

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>

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

我希望使用一种更简单的语法,类似于我最初的问题中的语法。


1
@Shimmy:“更好”在旁观者的眼中,可以将您自己的问题标记为已接受的答案
Andomar

1
@Shimmy更糟糕的是,他的回答包括一个“ 42”笑话。

6
@Andomar,更好的是人们用票来决定,这里也有投票权,这几乎是相同的答案。让ppl回答您的问题,然后复制他们的答案并获得声誉,因为这是完全错误的态度。
Shimmy Weitzhandler,2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.