2008-10-13 39 views
71

Các mã sau đây có một ràng buộc đơn giản mà liên kết với các văn bản của TextBlock tên MyTextBlock đến thuộc tính Text và ToolTip TextBox bằng cách sử dụng chính xác cùng một ký hiệu Binding:WPF ràng buộc với StringFormat không hoạt động trên 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> 

Các ràng buộc cũng sử dụng các StringFormat property introduced with .NET 3.5 SP1 đó là làm việc tốt cho các văn bản trên tài sản nhưng dường như bị hỏng cho các ToolTip. Kết quả mong đợi là "Nó là: Foo Bar" nhưng khi bạn di chuột qua TextBox, ToolTip chỉ hiển thị giá trị ràng buộc, chứ không phải giá trị được định dạng chuỗi. Bất kỳ ý tưởng?

+2

tôi đã không thể để có được một trong các giải pháp gợi ý dưới đây để làm việc, nhưng điều này đã làm: http://stackoverflow.com/questions/4498649/wpf-binding-stringformat-not-format –

Trả lời

-7

Sau đây là giải pháp wordy nhưng nó hoạt động.

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

Tôi muốn cú pháp đơn giản hơn nhiều, giống như cú pháp trong câu hỏi ban đầu của tôi.

+1

@Shimmy: "tốt hơn" là trong mắt của khán giả, và nó là alright để đánh dấu câu hỏi của riêng bạn câu trả lời được chấp nhận – Andomar

+1

@Shimmy Thậm chí tệ hơn, câu trả lời của ông bao gồm một trò đùa '42'. – Will

+5

@Andomar, tốt hơn là những gì mọi người quyết định với phiếu bầu của họ, cũng ở đây, hầu như chỉ là câu trả lời tương tự. làm cho ppl trả lời câu hỏi của bạn sau đó sao chép câu trả lời của họ và đạt được danh tiếng cho nó là một thái độ hoàn toàn sai lầm. – Shimmy

134

Chú giải công cụ trong WPF có thể chứa bất kỳ thứ gì, không chỉ văn bản, do đó chúng cung cấp thuộc tính ContentStringFormat cho những lần bạn chỉ muốn văn bản. Bạn sẽ cần phải sử dụng cú pháp mở rộng như xa như tôi biết:

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

Tôi không chắc chắn 100% về giá trị pháp lý ràng buộc bằng cách sử dụng cú pháp ElementName từ một tài sản lồng nhau như vậy, nhưng tài sản ContentStringFormat là những gì bạn đang tìm kiếm.

+1

Tôi thấy, tôi nghĩ ToolTip chỉ là một chuỗi đơn giản như trong Windows Forms. Và vâng, cú pháp ElementName trong trường hợp này không thể truy cập phần tử bên ngoài. – huseyint

+6

Lưu ý rằng {} chỉ được yêu cầu khi bạn đặt {0} ở đầu chuỗi, vì vậy bạn cần nó để phân biệt với các đánh dấu xaml khác. – Shimmy

+5

Tâm = thổi. Tôi chỉ đánh nó và giống như "waaaat?" – Will

2

Mã của bạn có thể ngắn như thế này:

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

Chúng tôi sẽ sử dụng chuyển đổi thực tế không bao giờ được bỏ qua, không giống như StringFormat.

Đặt này vào 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(); 
     } 
    } 
} 

Đặt này vào bạn ResourceDictionary.xaml:

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

Như Matt nói ToolTip có thể chứa bất cứ điều gì bên trong như vậy cho bạn, bạn có thể liên kết một TextBox.Text bên trong ToolTip của bạn.

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

Thậm chí bạn có thể xếp chồng lưới trong ToolTip và bố cục văn bản nếu muốn.

12

Đó có thể là lỗi. Khi bạn sử dụng cú pháp ngắn cho tooltip:

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

StringFormat là bỏ qua nhưng khi bạn sử dụng cú pháp mở rộng:

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

Nó hoạt động như mong đợi.

0

Trong tình huống này, bạn có thể sử dụng tương đối ràng buộc:

<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> 
Các vấn đề liên quan