2008-10-13 6 views
71

Der folgende Code hat eine einfache Bindung, die den Text des Textblock MyTextBlock zu TextBox Text und ToolTip-Eigenschaft mit der exakt gleichen Bindungs ​​Notation genannt bindet:WPF mit String Bindung funktioniert nicht auf ToolTips

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

Die Die Bindung verwendet auch die StringFormat property introduced with .NET 3.5 SP1, die für die obige Text-Eigenschaft funktioniert, aber für die QuickInfo zu brechen scheint. Das erwartete Ergebnis ist "Es ist: Foo Bar", aber wenn Sie den Mauszeiger über das Textfeld bewegen, zeigt die QuickInfo nur den Bindungswert an, nicht den string-formatierten Wert. Irgendwelche Ideen?

+2

ich nicht in der Lage war, eine der nachfolgend aufgeführten Lösungen zur Arbeit zu kommen, aber das tat: http://stackoverflow.com/questions/4498649/wpf-binding-stringformat-not-formating –

Antwort

-7

Das Folgende ist eine wortreiche Lösung, aber es funktioniert.

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

Ich würde eine viel einfachere Syntax bevorzugen, etwas wie das in meiner ursprünglichen Frage.

+1

@Shimmy: "Besser" ist im Auge des Betrachters, und es ist in Ordnung, Ihre eigene Frage die akzeptierte Antwort zu markieren – Andomar

+1

@Shimmy Noch schlimmer, enthält seine Antwort einen '42' Witz. – Will

+5

@Andomar, besser ist, was Leute mit ihren Stimmen entscheiden, auch hier ist es fast nur die selbe Antwort. Machen Sie Antworten auf Ihre Fragen, dann kopieren Sie ihre Antworten und gewinnen Sie einen guten Ruf, denn es ist eine völlig falsche Einstellung. – Shimmy

134

QuickInfos in WPF können alles enthalten, nicht nur Text, daher stellen sie eine ContentStringFormat-Eigenschaft für die Zeiten bereit, in denen Sie nur Text wünschen. Sie müssen die erweiterte Syntax so weit verwenden, wie ich weiß:

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

Ich bin nicht 100% sicher über die Gültigkeit der Bindung der Elementname Syntax von einer verschachtelten Eigenschaft wie die Verwendung, aber die Content Eigenschaft ist Nach was suchst du.

+1

Ich sehe, ich dachte ToolTip ist nur eine einfache Zeichenfolge wie in Windows Forms. Und ja, die Syntax von ElementName kann in diesem Fall nicht auf das äußere Element zugreifen. – huseyint

+6

Beachten Sie, dass {} nur erforderlich ist, wenn Sie {0} am Anfang der Zeichenfolge platzieren, damit Sie sie von den anderen XAML-Markups unterscheiden können. – Shimmy

+5

Mind = geblasen. Ich habe das einfach getroffen und war wie "waaaat?" – Will

2

Ihr Code kann dies so kurz sein:

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

Wir werden die Tatsache Wandler verwenden, werden nie ignoriert, anders als String.

diese setzen in 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(); 
     } 
    } 
} 

diese setzen in Ihrem ResourceDictionary.xaml:

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

Als Matt sagte ToolTip etwas im Inneren enthalten kann so für Ihren könnten Sie binden Sie einen TextBox.Text innerhalb Ihrer QuickInfo.

Auch Sie können ein Raster innerhalb der QuickInfo stapeln und Ihren Text gestalten, wenn Sie möchten.

12

Es könnte ein Fehler sein. Wenn Sie kurze Syntax für Tooltip verwenden:

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

String ist zu ignorieren, aber wenn Sie erweiterte Syntax:

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

Es funktioniert wie erwartet.

0

In dieser Situation können Sie Bindung verwenden relativ:

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