Sử dụng StringFormat để thêm một chuỗi vào liên kết WPF XAML


124

Tôi có một ứng dụng WPF 4 có chứa TextBlock có liên kết một chiều với một giá trị số nguyên (trong trường hợp này là nhiệt độ tính bằng độ C). XAML trông như thế này:

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

Điều này hoạt động tốt để hiển thị giá trị nhiệt độ thực tế nhưng tôi muốn định dạng giá trị này để nó bao gồm ° C thay vì chỉ số (30 ° C thay vì chỉ 30). Tôi đã đọc về StringFormat và tôi đã thấy một số ví dụ chung như thế này:

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>

Thật không may, không có ví dụ nào tôi thấy đã nối một chuỗi vào giá trị ràng buộc như tôi đang cố gắng thực hiện. Tôi chắc chắn rằng nó phải là một cái gì đó đơn giản nhưng tôi không có may mắn tìm thấy nó. Bất cứ ai có thể giải thích cho tôi làm thế nào để làm điều đó?

Câu trả lời:


217

Ví dụ đầu tiên của bạn là hiệu quả những gì bạn cần:

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

20
Tại sao định dạng chuỗi trong xaml có hàng đầu trống {}?
Jonesopolis

6
@Jonesopolis Đó là trong các tài liệu - nhưng nếu chuỗi định dạng của bạn bắt đầu bằng a {, nó cung cấp một cơ chế để thoát, vì {}đã có ý nghĩa trong xaml.
Sậy Copsey

5
Tôi không thấy tài liệu giải thích hàng đầu {}.
Eric

5
@Eric Giống như nhiều tài liệu, nó bốc mùi - họ giới thiệu nó, nhưng không giải thích.
Sậy Copsey

19
đây là tài liệu về bí ẩn {}: msdn.microsoft.com/en-us/l
Library / ms744986.aspx

106

Đây là một thay thế hoạt động tốt cho khả năng đọc nếu bạn có Binding ở giữa chuỗi hoặc nhiều ràng buộc:

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>

6
Tôi thích câu trả lời này tốt hơn một chút vì tôi có thể chèn văn bản từ thư viện chuỗi một cách dễ dàng. Tất nhiên, nếu bạn thực sự lo lắng về việc quốc tế hóa, có lẽ bạn nên sử dụng một công cụ chuyển đổi để thứ tự số lượng và đơn vị không cố định. <Chạy văn bản = "{x: Tĩnh s: UIStrings.General_Fahrenheit Aboustviation}" />
Matt Becker

1
Đây là một giải pháp tuyệt vời, nhưng tôi nhận được thêm không gian trong màn hình văn bản cuối cùng, giữa các lần chạy văn bản - có ý tưởng nào tại sao không? Trong ví dụ của bạn, tôi thấy0 °C ( 32 °F)
Conrad

Nó không hữu ích nếu bạn muốn thực hiện định dạng chuỗi thực tế (nghĩa là kiểm soát số lượng vị trí thập phân, v.v.).
BrainSlugs83

5
@Conrad Nếu bạn không muốn khoảng trắng giữa mỗi lần chạy, bạn nên đặt các lần chạy đó trên một dòng như sau: <TextBlock> <Run Text = "{Binding CelsiusTemp}" /> <Run Text = "° C" / > <Run Text = "(" /: <Run Text = "{Binding Fahrenheit}" /> <Run Text = "° F)" /> </ TextBlock>
Ladislav Ondris

91

Xin lưu ý rằng việc sử dụng StringFormat trong Bindings dường như chỉ hoạt động đối với các thuộc tính "văn bản". Sử dụng cái này cho Label.Content sẽ không hoạt động


15
Một điểm quan trọng RẤT NHIỀU đã đưa tôi thử nó cho đến khi tôi tuyệt vọng và tìm thấy nhận xét này để xác thực sự nghi ngờ của tôi.
DonBoitnott

64
ContentStringFormatđến để giải cứu, ví dụ : Content="{Binding Path=TargetProjects.Count}" ContentStringFormat="Projects: {0}".
Astrowalker

2
Cảm ơn Casper, anh hùng thực sự đã đăng thông tin đó.
DaWiseguy

5
đối với các tiêu đề GridViewColumn, hãy sử dụngHeaderStringFormat="{}{0} For Report"
Felix

2
Nếu bạn đang sử dụng dữ liệu thời gian thiết kế, có vẻ như bạn cần xây dựng lại dự án sau khi chỉnh sửa ContentStringFormat để có các thay đổi để phản ánh trong trình thiết kế, trong khi StringFormat như được sử dụng trên hộp văn bản sẽ cập nhật trình thiết kế trong thời gian thực.
Richard Moore

-8

Trong xaml

<TextBlock Text="{Binding CelsiusTemp}" />

Trong ViewModel, cách này thiết lập giá trị cũng hoạt động:

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }

19
Điều này đi ngược lại với toàn bộ quan điểm phân tách View-Viewmodel
Askolein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.