Связывание WPF с StringFormat не работает на подсказках
Следующий код имеет простую привязку, которая связывает текст TextBlock с именем MyTextBlock с 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>
Связывание также использует свойство StringFormat, введенное с .NET 3.5 SP1, которое отлично работает для указанного свойства Text, но, похоже, всплывающая подсказка. Ожидаемый результат: "Это: Foo Bar", но когда вы наводите курсор на TextBox, ToolTip показывает только значение привязки, а не форматированное значение строки. Любые идеи?
Ответы
Ответ 1
Ниже приводится многословное решение, но оно работает.
<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>
Я бы предпочел гораздо более простой синтаксис, похожий на тот, который был в моем первоначальном вопросе.
Ответ 2
Подсказки в WPF могут содержать что угодно, а не только текст, поэтому они предоставляют свойство ContentStringFormat для того времени, когда вы просто хотите текст. Насколько мне известно, вам нужно использовать расширенный синтаксис:
<TextBox ...>
<TextBox.ToolTip>
<ToolTip
Content="{Binding ElementName=myTextBlock,Path=Text}"
ContentStringFormat="{}It is: {0}"
/>
</TextBox.ToolTip>
</TextBox>
Я не уверен на 100% относительно действительности привязки с использованием синтаксиса ElementName из вложенного свойства, подобного этому, но свойство ContentStringFormat - это то, что вы ищете.
Ответ 3
Это может быть ошибка.
Когда вы используете короткий синтаксис для всплывающей подсказки:
<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
Как сказал Мэтт, ToolTip может содержать что-либо внутри, поэтому для вас вы можете привязать TextBox.Text внутри своей 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>
Даже вы можете выставить сетку внутри всплывающей подсказки и разместить свой текст, если хотите.
Ответ 5
Ваш код может быть короче:
<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"/>