2008-10-13 11 views
71

Następujący kod ma prosty wiążące, która wiąże się z tekstem TextBlock o nazwie MyTextBlock do tekstu i etykietka własności pola tekstowego Korzystanie z dokładnie taką samą oprawę notacji:WPF wiązania z StringFormat nie działa na podpowiedzi

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

Wiązanie również używa StringFormat property introduced with .NET 3.5 SP1, który działa poprawnie dla powyższej właściwości Text, ale wydaje się być uszkodzony dla ToolTip. Oczekiwanym wynikiem jest "It is: Foo Bar", ale gdy umieścisz kursor nad polem tekstowym, ToolTip pokazuje tylko wartość wiązania, a nie wartość sformatowaną w ciągu znaków. Jakieś pomysły?

+2

nie byłem w stanie uzyskać żadnej z proponowanych rozwiązań poniżej do pracy, ale ten zrobił: http://stackoverflow.com/questions/4498649/wpf-binding-stringformat-not-formatting –

Odpowiedz

-7

Poniżej znajduje się rozwlekłe rozwiązanie, ale działa.

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

Wolałbym prostszą składnię, podobną do tej z oryginalnego pytania.

+1

@Shimmy: "lepiej" jest w oku patrzącego i dobrze jest zaznaczyć własne pytanie zaakceptowaną odpowiedzią – Andomar

+1

@Shimmy Jeszcze gorzej, jego odpowiedź zawiera żart "42". – Will

+5

@Andomar, lepsze jest to, co ludzie decydują swoimi głosami, także tutaj, jest to prawie ta sama odpowiedź. sprawić, by ppl odpowiadały na twoje pytania, a następnie kopiować odpowiedzi i zyskać reputację, ponieważ jest to całkowicie błędna siła. – Shimmy

134

Etykietki narzędzi w WPF mogą zawierać wszystko, nie tylko tekst, więc udostępniają właściwość ContentStringFormat dla potrzebnych czasów. Musisz użyć składni rozszerzoną o ile wiem:

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

nie jestem 100% pewny co do ważności wiązania przy użyciu składni ElementName z zagnieżdżonego własności takiego, ale jest własnością ContentStringFormat czego szukasz.

+1

Rozumiem, myślałem, że ToolTip to zwykły ciąg znaków, jak w Windows Forms. I tak, składnia ElementName w tym przypadku nie może uzyskać dostępu do elementu zewnętrznego. – huseyint

+6

Zwróć uwagę, że {} jest wymagany tylko wtedy, gdy umieścisz {0} na początku łańcucha, więc musisz go odróżnić od innych znaczników xaml. – Shimmy

+5

Mind = dmuchane. Właśnie uderzyłem to i było jak "waaaat?" – Will

2

Twój kod może być tak krótki, jak to:

<TextBlock ToolTip="{Binding PrideLands.YearsTillSimbaReturns, 
    Converter={StaticResource convStringFormat}, 
    ConverterParameter='Rejoice! Just {0} years left!'}" Text="Hakuna Matata"/> 

Będziemy wykorzystują fakt Konwertery nigdy nie są ignorowane, w przeciwieństwie StringFormat.

Włóż to do 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(); 
     } 
    } 
} 

umieścić to w swoim ResourceDictionary.xaml:

<conv:StringFormatConverter x:Key="convStringFormat"/> 
4

Jak powiedział Matt etykietka może zawierać niczego wewnątrz tak dla Twojego mogłeś bind TextBox.Text wewnątrz ToolTip.

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

Nawet ty możesz układać siatkę wewnątrz etykiety narzędzi i układać tekst, jeśli chcesz.

12

To może być błąd. Podczas korzystania krótkie składnię podpowiedzi:

<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" /> 

StringFormat to ignorować, ale kiedy użyć rozszerzonej składni:

<TextBox Text="text"> 
    <TextBox.ToolTip> 
     <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/> 
    </TextBox.ToolTip> 
</TextBox> 

To działa zgodnie z oczekiwaniami.

0

W tej sytuacji można użyć w stosunku oprawa:

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