91

次のコードには、まったく同じバインディング表記を使用して、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>

バインディングは、 .NET 3.5 SP1 で導入された StringFormat プロパティも使用します。これは、上記の Text プロパティでは正常に機能しますが、ToolTip では壊れているようです。期待される結果は "It is: Foo Bar" ですが、TextBox にカーソルを合わせると、ToolTip にはバインディング値のみが表示され、文字列形式の値は表示されません。何か案は?

4

6 に答える 6

165

WPF のツールヒントには、テキストだけでなく、何でも含めることができるため、テキストだけが必要な場合に ContentStringFormat プロパティを提供します。私の知る限り、拡張構文を使用する必要があります。

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

そのようなネストされたプロパティからの ElementName 構文を使用したバインディングの有効性については 100% 確信が持てませんが、ContentStringFormat プロパティはあなたが探しているものです。

于 2008-10-13T09:45:41.297 に答える
26

バグかもしれません。ツールチップに短い構文を使用する場合:

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

期待どおりに動作します。

于 2014-07-31T09:54:28.083 に答える
3

コードは次のように短くできます。

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

StringFormat とは異なり、Converter は決して無視されないという事実を使用します。

これを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"/>
于 2012-12-25T22:01:07.100 に答える
-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>

元の質問のような、もっと単純な構文を好むでしょう。

于 2008-10-13T12:18:28.180 に答える