Связывание WPF с StringFormat не работает для всплывающих подсказок - PullRequest
79 голосов
/ 13 октября 2008

Следующий код имеет простую привязку, которая связывает текст TextBlock с именем MyTextBlock со свойствами TextBox Text и ToolTip, используя точно такую ​​же запись Binding:

<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, представленное в .NET 3.5 SP1 , которое отлично работает для указанного выше свойства Text, но, похоже, не работает для всплывающей подсказки. Ожидаемый результат - «Это: Foo Bar», но когда вы наводите курсор мыши на TextBox, всплывающая подсказка показывает только значение привязки, а не значение в формате строки. Есть идеи?

Ответы [ 6 ]

145 голосов
/ 13 октября 2008

Всплывающие подсказки в WPF могут содержать что угодно, а не только текст, поэтому они предоставляют свойство ContentStringFormat для тех времен, когда вам просто нужен текст. Насколько я знаю, вам нужно будет использовать расширенный синтаксис:

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

Я не уверен на 100% в правильности привязки с использованием синтаксиса ElementName из подобного вложенного свойства, но именно свойство ContentStringFormat - это то, что вы ищете.

16 голосов
/ 31 июля 2014

Это может быть ошибкой. Когда вы используете короткий синтаксис для всплывающей подсказки:

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

Работает как положено.

4 голосов
/ 13 января 2014

Как сказал Мэтт, всплывающая подсказка может содержать внутри что угодно, так что вы можете привязать 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>

Даже вы можете сложить сетку внутри всплывающей подсказки и расположить текст, если хотите.

3 голосов
/ 26 декабря 2012

Ваш код может быть таким коротким, как этот:

<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"/>
0 голосов
/ 10 января 2018

В этой ситуации вы можете использовать относительное связывание:

<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>
0 голосов
/ 13 октября 2008

Следующее является многословным решением, но оно работает.

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

Я бы предпочел намного более простой синтаксис, примерно такой, как в моем первоначальном вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...