WPF 与 StringFormat 的绑定在 ToolTips 上不起作用

Posted

技术标签:

【中文标题】WPF 与 StringFormat 的绑定在 ToolTips 上不起作用【英文标题】:WPF binding with StringFormat doesn't work on ToolTips 【发布时间】:2010-09-16 20:39:52 【问题描述】:

以下代码有一个简单的绑定,它使用完全相同的绑定表示法将名为 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 属性运行良好,但对于 ToolTip 似乎已损坏。预期的结果是“它是:Foo Bar”,但是当您将鼠标悬停在 TextBox 上时,工具提示仅显示绑定值,而不是字符串格式的值。有什么想法吗?

【问题讨论】:

我无法让以下建议的解决方案中的任何一个起作用,但这个解决方案做到了:***.com/questions/4498649/… 【参考方案1】:

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

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

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

【讨论】:

我明白了,我认为 ToolTip 只是一个普通字符串,就像在 Windows 窗体中一样。是的,在这种情况下 ElementName 语法无法访问外部元素。 请注意,仅当您将 0 放在字符串的开头时才需要 ,因此您需要它来与其他 xaml 标记区分开来。 头脑=被吹了。我刚刚打了这个,就像“waaaat?” 当没有指定转换器时,它真的让我觉得 stringformat 不能“正常工作”。我必须编写自己的 stringformatConverter。 MS又掉球了…… StringFormat 仅在 TargetType 是字符串类型时应用。 ToolTip 内容类型为 object【参考方案2】:

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

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

它按预期工作。

【讨论】:

最准确的答案..谢谢! WhatEverYouWant 编译后缺少逗号【参考方案3】:

正如马特所说,工具提示可以包含任何内容,因此您可以在工具提示中绑定一个 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 内堆叠一个网格并根据需要对文本进行布局。

【讨论】:

【参考方案4】:

你的代码可以这么短:

<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 问题让我大吃一惊。这个答案适用于我的情况,而其他人没有。【参考方案5】:

在这种情况下,您可以使用相对绑定:

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

【讨论】:

【参考方案6】:

以下是一个冗长的解决方案,但它有效。

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

我更喜欢更简单的语法,类似于我最初问题中的语法。

【讨论】:

@Shimmy:旁观者眼中的“更好”,可以将自己的问题标记为已接受的答案 @Shimmy 更糟糕的是,他的回答还包括一个“42”笑话。 @Andomar,更好的是人们用他们的投票来决定,这里也特别,它几乎是相同的答案。让人们回答你的问题,然后复制他们的答案并获得声誉,因为这是一种完全错误的态度。

以上是关于WPF 与 StringFormat 的绑定在 ToolTips 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF - 从 XAML 中的 StringFormat 绑定属性访问属性值

WPF 绑定和动态分配 StringFormat 属性

WPF绑定StringFormat不会改变输出[重复]

wpf Content数据绑定StringFormat起作用的原理和解决

WPF在XAML中Binding使用StringFormat属性

Silverlight 是不是支持 StringFormat 绑定?