2009-09-09 28 views
9

Tôi đang tìm một cái gì đó dọc theo những dòng:Làm thế nào để bạn chèn một ràng buộc vào giữa một câu của một TextBlock trong WPF?

<TextBlock 
    Grid.Column="1" 
    Text="Welcome, {Binding UserName}!" /> 

này tất nhiên sẽ thực sự hiển thị dòng chữ "{Binding UserName}" cho người sử dụng chứ không phải giải mã nó, nhưng tôi biết bạn có thể làm điều gì đó như thế này với ASP.NET, vì vậy tôi hy vọng có một cách để có được điều này để làm việc trong WPF.

Tôi đã biết rằng tôi có thể sử dụng IValueConverter ... Tôi đang tìm kiếm thứ gì đó tôi có thể làm hoàn toàn trong đánh dấu nếu có thể.

EDIT:

Dựa trên giải pháp tuyệt vời nhất @ Matt Hamilton, tôi đã cố gắng để đẩy phong bì và ràng buộc hai giá trị vào cùng TextBlock sử dụng một MultiBinding. Hoạt động như một nét duyên dáng:

<TextBlock 
    Style="{StaticResource TextBlock_ValueStyle}" 
    Grid.Column="1"> 
    <TextBlock.Text> 
     <MultiBinding 
      StringFormat="{}Attempts: {0:G} of {1:G}"> 
      <Binding 
       Path="AttemptNumber" /> 
      <Binding 
       Path="AttemptCount" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

này tạo ra: Attempts: 1 of 4 (giả sử AttemptNumber = 1AttemptCount = 4).

Tôi cũng tìm thấy liên kết này hữu ích cho việc chỉ ra các định dạng để đặt sau dấu hai chấm:

http://msdn.microsoft.com/en-us/library/fbxft59x.aspx

Trả lời

15

Bạn có thể sử dụng thuộc tính ràng buộc StringFormat trong .NET 3.5 SP1:

<TextBlock Text="{Binding UserName,StringFormat='Welcome, \{0\}!'}" /> 

Lưu ý rằng bạn cần phải thoát khỏi dấu ngoặc nhọn theo định dạng chuỗi với một dấu gạch chéo.

Cập nhật Vâng, nhiều giá trị cũng được hỗ trợ:

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="Welcome, {0} {1}!"> 
      <Binding Path="FirstName" /> 
      <Binding Path="LastName" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
+0

Whee, đó là tốt đẹp. Tuy nhiên, thứ tự là lạ, vì nó hoàn toàn trái ngược với định dạng [string] :: thông thường. – Joey

+0

Đẹp! Điều này dẫn tôi đến một câu hỏi khác, mặc dù: Có thể có nhiều giá trị bị ràng buộc hoặc bạn bị giới hạn trong một câu hỏi không? Cảm ơn. – devuxer

+0

Đã trả lời câu hỏi của riêng tôi (xem chỉnh sửa của tôi). – devuxer

0

Cho đến nay tôi không biết của một giải pháp mà làm cho điều này có thể chính xác theo cùng một cách như bạn mô tả nó. Tuy nhiên, bạn có thể, như một cách giải quyết, sử dụng nhiều khối văn bản để xâu chuỗi câu của bạn:

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Welcome, "/> 
    <TextBlock Text="{Binding UserName}"/> 
    <TextBlock Text="!"/> 
</StackPanel> 

Đây là những gì tôi đã sử dụng cho đến nay và trong khi rườm rà để gõ nó có vẻ là giải pháp đơn giản nhất. Nhưng ngay sau khi bạn cần Quốc tế hóa nó là một không-đi vì lý do rõ ràng.

+0

Tôi đã sử dụng 'StackPanel' để ghép các chuỗi thuộc tính-giá trị với nhau trước (ví dụ:" Trạng thái: Thành công "), nhưng tôi hơi cảnh giác khi sử dụng nó để ghép các phần khác nhau của một câu bởi vì Tôi nghĩ rằng khoảng cách văn bản tự nhiên có thể không được bảo tồn (ví dụ, bạn muốn có khoảng ngắt lớn giữa 'TextBlocks' hơn giữa các từ của cùng một' TextBlock'. Nếu điều này không thành vấn đề, thì đây là một giải pháp tốt – devuxer

+0

Cho đến nay tôi nhận thấy không có thêm không gian.Nhưng kerning rất có thể sẽ không làm việc như sẽ ligatures tự động, vv Về cơ bản bạn phá vỡ các văn bản vào chạy khác nhau và tôi nghi ngờ kiểu chữ tiên tiến hoạt động trên những người.Nhưng đối với một số dự án phần i18n là một điều khá nghiêm trọng và tôi tránh ghép các chuỗi và biến hoặc sử dụng các chuỗi định dạng không có vị trí bất cứ khi nào có thể. Đôi khi một giải pháp nhanh chóng và bẩn như thế này tồn tại, mặc dù :-) – Joey

0

Có một cái nhìn tại thư viện này "WPFix". Nó cho phép người dùng viết các biểu thức lambda trong XAML. Tôi đã không sử dụng nó trong mã sản xuất, chỉ trong mã demo. Tôi đã có thể lấy chiều rộng của một biểu mẫu, chia nó thành hai, và ràng buộc giá trị với một điều khiển. Thông thường, bạn sẽ cần phải tạo ra một lớp chuyển đổi, như bạn mô tả. Thư viện này có thể là điều bạn đang tìm kiếm:

http://www.fikrimvar.net/lestirelim/?p=15

1

Đây là cách đơn giản nhất để trộn văn bản và kiểm soát

<TextBlock>Welcome, <TextBlock Text="{Binding UserName}"/>!</TextBlock> 

bạn có thể inline nút kiểu hoặc điều khiển khác để.

1

Cách tốt nhất để làm việc đó là sử dụng Chạy ...

<TextBlock> 
    <Run Text="Welcome"/> 
    <Run Text="{Binding UserName}"/> 
    <Run Text="!"/> 
</TextBlock> 
Các vấn đề liên quan