Kode berikut memiliki pengikatan sederhana yang mengikat Teks dari TextBlock bernama MyTextBlock ke TextBox's Text dan properti ToolTip menggunakan notasi Binding yang sama persis:
<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>
Pengikatan juga menggunakan properti StringFormat yang diperkenalkan dengan .NET 3.5 SP1 yang berfungsi dengan baik untuk properti Teks di atas tetapi tampaknya rusak untuk ToolTip. Hasil yang diharapkan adalah "Ini adalah: Foo Bar" tetapi saat Anda mengarahkan kursor ke TextBox, ToolTip hanya menampilkan nilai pengikatan, bukan nilai yang diformat string. Ada ide?
Jawaban:
ToolTips di WPF dapat berisi apa saja, bukan hanya teks, jadi toolTips menyediakan properti ContentStringFormat untuk saat Anda hanya menginginkan teks. Anda harus menggunakan sintaks yang diperluas sejauh yang saya tahu:
<TextBox ...> <TextBox.ToolTip> <ToolTip Content="{Binding ElementName=myTextBlock,Path=Text}" ContentStringFormat="{}It is: {0}" /> </TextBox.ToolTip> </TextBox>
Saya tidak 100% yakin tentang validitas pengikatan menggunakan sintaks ElementName dari properti bersarang seperti itu, tetapi properti ContentStringFormat adalah yang Anda cari.
sumber
StringFormat
hanya akan diterapkan jikaTargetType
tipe stringnya.ToolTip
Konten adalah tipeobject
.Ini bisa jadi bug. Saat Anda menggunakan sintaks pendek untuk tooltip:
<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" />
StringFormat diabaikan tetapi ketika Anda menggunakan sintaks yang diperluas:
<TextBox Text="text"> <TextBox.ToolTip> <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/> </TextBox.ToolTip> </TextBox>
Ini bekerja seperti yang diharapkan.
sumber
Seperti yang dikatakan Matt, ToolTip dapat berisi apa pun di dalamnya sehingga Anda dapat mengikat TextBox.Text di dalam ToolTip Anda.
<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>
Bahkan Anda dapat Menumpuk kotak di dalam ToolTip dan mengatur tata letak teks Anda jika Anda mau.
sumber
Kode Anda bisa sesingkat ini:
<TextBlock ToolTip="{Binding PrideLands.YearsTillSimbaReturns, Converter={StaticResource convStringFormat}, ConverterParameter='Rejoice! Just {0} years left!'}" Text="Hakuna Matata"/>
Kami akan menggunakan fakta bahwa Converters tidak pernah diabaikan, tidak seperti StringFormat.
Masukkan ini ke dalam 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(); } } }
Masukkan ini ke ResourceDictionary.xaml Anda :
<conv:StringFormatConverter x:Key="convStringFormat"/>
sumber
Dalam situasi ini, Anda dapat menggunakan pengikatan relatif:
<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>
sumber
Berikut ini adalah solusi bertele-tele tetapi berhasil.
<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>
Saya lebih suka sintaks yang lebih sederhana, seperti yang ada di pertanyaan awal saya.
sumber