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

hus*_*int 83 wpf binding

下面的代码有一个简单的绑定,它使用完全相同的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>
Run Code Online (Sandbox Code Playgroud)

绑定还使用.NET 3.5 SP1引入StringFormat属性,该属性对于上面的Text属性工作正常但似乎在工具提示中被破坏.预期的结果是"它是:Foo Bar",但是当您将鼠标悬停在TextBox上时,ToolTip仅显示绑定值,而不是字符串格式化的值.有任何想法吗?

Mat*_*ton 151

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

<TextBox ...>
  <TextBox.ToolTip>
    <ToolTip 
      Content="{Binding ElementName=myTextBlock,Path=Text}"
      ContentStringFormat="{}It is: {0}"
      />
  </TextBox.ToolTip>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,仅当将{0}放在字符串的开头时才需要{},因此您需要将其与其他xaml标记区分开来. (8认同)
  • 心灵=被吹.我只是打了这个,就像"waaaat?" (5认同)
  • 只有在`TargetType`是字符串类型时才会应用`StringFormat`.`ToolTip`内容是`object`类型. (3认同)
  • 当我没有指定转换器时,它确实让我感到困惑,因为stringformat并不"正常工作".我不得不写自己的stringformatConverter.MS再次丢球...... (2认同)

Mui*_*ota 21

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

<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" />
Run Code Online (Sandbox Code Playgroud)

StringFormat是忽略但是当您使用扩展语法时:

<TextBox Text="text">
   <TextBox.ToolTip>
      <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/>
   </TextBox.ToolTip>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

它按预期工作.

  • 最准确的答案..谢谢! (2认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

即使您可以在工具提示内堆叠网格并根据需要布置文本。


hus*_*int -8

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

  • @Andomar,更好的是人们用他们的选票决定的,特别是在这里,它几乎是相同的答案。让别人回答你的问题然后复制他们的答案并因此获得声誉是一种完全错误的态度。 (6认同)