2008-10-13 48 views
71

下面的代碼無法正常工作有一個簡單的綁定結合使用完全相同的綁定符號命名MyTextBlock到文本框的文本和工具提示財產TextBlock的文字:WPF用的StringFormat結合的工具提示

<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這是工作正常的上述文本屬性,但似乎被打破了工具提示。預期的結果是「它是:Foo Bar」,但是當您將鼠標懸停在文本框上時,工具提示僅顯示綁定值,而不顯示字符串格式化值。有任何想法嗎?

+2

我是不是能夠得到以下兩種工作建議的解決方案的,但是這一次做的:http://stackoverflow.com/questions/4498649/wpf-binding-stringformat-not-formatting – 2012-12-06 15:17:10

回答

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

我寧願更簡單的語法,就像我原來的問題中的一個。

134

WPF中的工具提示可以包含任何內容,而不僅僅是文本,因此它們爲您想要文本的時間提供ContentStringFormat屬性。你需要儘可能使用展開的語法,因爲我知道:

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

我不是100%肯定的利用這樣的一個嵌套屬性的ElementName語法綁定的有效性,但ContentStringFormat屬性你在找什麼。

+1

我明白了,我認爲ToolTip只是一個普通的字符串,就像在Windows窗體中一樣。是的,在這種情況下,ElementName語法不能訪問外部元素。 – huseyint 2008-10-13 12:13:05

+6

請注意,僅當您將{0}放置在字符串的開頭時才需要{},因此您需要將{}與其他xaml標記區分開來。 – Shimmy 2009-12-12 23:34:28

2

您的代碼可以儘可能短,這樣的:

<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

正如馬特說工具提示中還可以包含任何使你的你可以在您的工具提示中綁定一個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> 

即使您可以在工具提示中堆疊網格,並根據需要佈置文本。

12

這可能是一個錯誤。 當您使用短語法提示:

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

它按預期工作。

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>