2009-03-20 36 views
24

Làm thế nào để đạt được kết hợp các giá trị bị ràng buộc với văn bản không đổi trong điều khiển ràng buộc WPF?Chỉ ràng buộc một phần của nhãn

Ví dụ: giả sử tôi có biểu mẫu hiển thị đơn hàng và tôi muốn nhãn hiển thị văn bản như "ID đặt hàng 1234".

điều tôi đã cố gắng như:

text="Order ID {Binding ....}" 

là có thể đạt được điều này, hoặc tôi phải làm điều gì đó giống như có nhiều hơn một nhãn trong một điều khiển dòng chảy?

Trả lời

23

Nếu bạn đang sử dụng 3,5 SP1, bạn có thể sử dụng StringFormat tài sản trên các ràng buộc:

<Label Content="{Binding Order.ID, StringFormat=Order ID \{0\}}"/> 

Nếu không, sử dụng một bộ chuyển đổi:

<local:StringFormatConverter x:Key="StringFormatter" StringFormat="Order ID {0}" /> 
<Label Content="{Binding Order.ID, Converter=StringFormatter}"/> 

Với StringFormatConverter là một IValueConverter:

[ValueConversion(typeof(object), typeof(string))] 
public class StringFormatConverter : IValueConverter 
{ 
    public string StringFormat { get; set; } 

    public object Convert(object value, Type targetType, 
          object parameter, CultureInfo culture) { 
     if (string.IsNullOrEmpty(StringFormat)) return ""; 
     return string.Format(StringFormat, value); 
    } 


    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

Điều đó sẽ thực hiện thủ thuật.

[Sửa: Thay đổi Text tài sản để Content]

+1

Với ví dụ về chuỗi định dạng, điều gì sẽ xảy ra nếu chuỗi cần chứa dấu phẩy?Sau đó bạn có không có sự lựa chọn, nhưng để đi với các tùy chọn chuyển đổi? –

+3

AFAIK điều khiển nhãn không có thuộc tính 'Văn bản'. Bạn nên liên kết với thuộc tính 'Content' –

4

phương pháp khác là sử dụng một TextBlock đơn với nhiều yếu tố Run bên trong nó:

<TextBlock><Run>Hello</Run><Run>World</Run></TextBlock> 

.. nhưng để ràng buộc vào một yếu tố bạn cần sử dụng thêm lớp BindableRun.

Cập nhật Nhưng có một số nhược điểm của kỹ thuật này ... thấy here

+0

Đây là lựa chọn nếu bạn muốn có một định dạng khác (số in đậm f.e.) –

5

Thường bị bỏ qua chỉ đơn giản là chaining nhiều TextBlocks cùng ví dụ

<TextBlock Text="{Binding FirstName}" /> 
<TextBlock Text=" " /> 
<TextBlock Text="{Binding LastName}" /> 
+0

Điều này sẽ được hiển thị trên 3 dòng riêng biệt. –

+3

điều này phụ thuộc vào loại stackpanel trong số –

49

Thuộc tính Binding.StringFormat không hoạt động trên Nhãn, bạn cần sử dụng thuộc tính ContentStringFormat trên Nhãn.
Ví dụ, mẫu sau đây sẽ làm việc:

<Label Grid.Row="0" Name="TitleLabel"> 
    <Label.Content> 
     <Binding Path="QuestionnaireName"/> 
    </Label.Content> 
    <Label.ContentStringFormat> 
     Thank you for taking the {0} questionnaire 
    </Label.ContentStringFormat> 
</Label> 

Trong khi mẫu này sẽ không:

<Label Grid.Row="0" Name="TitleLabel"> 
     <Label.Content> 
      <Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/> 
     </Label.Content>    
    </Label> 
+0

Thở dài. Một hạn chế tùy ý khác do các nhà phát triển WPF áp đặt. – glebd

+0

Bất kỳ ý tưởng nào tại sao Binding.StringFormat không hoạt động? – Wouter

+2

Vì 'Label.Content' thuộc loại' Object', ràng buộc không cần chuyển đổi và định dạng giá trị thành chuỗi. – YotaXP

2

Tôi tìm thấy một cách tiếp cận khác. @ Inferis của giải pháp không làm việc cho tôi và @ LPCRoy của không phải là thanh lịch cho tôi:

<Label Content="{Binding Path=Order.ID, FallbackValue=Placeholder}" ContentStringFormat="Order ID {0}"> 

Đó là yêu thích của tôi tại thời điểm này, nó có vẻ linh hoạt và cô đặc.

0

Câu trả lời của Mikolaj đã được sửa đổi.

<Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" /> 

Dự phòng không phải là bắt buộc.

Các vấn đề liên quan