Làm cách nào để liên kết nhiều giá trị với một TextBlock WPF?


210

Tôi hiện đang sử dụng TextBlockbên dưới để liên kết giá trị của một tài sản có tênName :

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

Bây giờ, tôi muốn ràng buộc một tài sản khác có tênID giống nhau TextBlock.

Có thể liên kết hai hoặc nhiều giá trị với nhau TextBlockkhông? Nó có thể được thực hiện với sự kết hợp đơn giản, như Name + IDvà, nếu không, làm thế nào điều này có thể được tiếp cận?

Câu trả lời:


434

Bạn có thể sử dụng MultiBindingkết hợp với StringFormattài sản. Cách sử dụng sẽ giống như sau:

<TextBlock>
    <TextBlock.Text>    
        <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="Name" />
            <Binding Path="ID" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Đưa ra Namemột giá trị FooIDmột giá trị 1, đầu ra của bạn trong TextBlock sẽ là Foo + 1.

Note: rằng điều này chỉ được hỗ trợ trong .NET 3.5 SP1 và 3.0 SP2 trở lên.


5
@Preet - Tôi thực sự không chắc chắn nếu '{}' là cần thiết trong trường hợp này, tôi đã bao gồm nó vì nó được sử dụng trên mẫu MSDN. Tuy nhiên, nói chung, nó là một chuỗi thoát cho trình phân tích cú pháp XAML để tránh nhầm lẫn với phần mở rộng đánh dấu Binding.
Richard McGuire

2
Có một mặt ảnh hưởng đến điều này. Nếu bạn sử dụng phương pháp này trong một cái gì đó như một DataGridhành vi sắp xếp không may không hoạt động. Một giải pháp phù hợp hơn sẽ là tạo một thuộc tính chỉ đọc trong mô hình của bạn với định dạng chuỗi thích hợp để liên kết. Không cần phải nói, đây là một cách gọn gàng để nhanh chóng định dạng mặc dù một chút dài dòng.
Brett Ryan

34
bạn chỉ cần {} khi chuỗi định dạng bắt đầu bằng tham số {0}, không cần thiết nếu chuỗi định dạng bắt đầu bằng văn bản. ví dụ: "{} {0} + {1}" "Trang {0} của {1}"
Dakianth

Nó không hoạt động trên một dự án WPF .Net 4.0 Visual Studio 2017.
Sorush 26/03/19

@ Giải pháp của Patrick làm việc cho tôi. Tôi không thể làm việc này. Tôi đã có lỗi nàyXamlParseException: A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
Tyson Williams

127

Tôi biết đây là một cách muộn, nhưng tôi nghĩ tôi đã thêm một cách khác để làm điều này.

Bạn có thể tận dụng thực tế là thuộc tính Text có thể được đặt bằng " Run s", do đó bạn có thể thiết lập nhiều liên kết bằng cách sử dụng Run cho mỗi cái. Điều này hữu ích nếu bạn không có quyền truy cập vào MultiBinding (mà tôi không tìm thấy khi phát triển cho Windows Phone)

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>

4
Đây là một cách tiếp cận rất tiện lợi để sử dụng khi liên kết với một số chuỗi có nguồn gốc là DynamicResource vì bạn không thể sử dụng MultiBinding với StringFormat cho điều đó.
sên

Tôi chỉ thử điều này. Nó hoạt động, tuy nhiên mọi yếu tố (thậm chí là hình học) được vẽ (khi làm mới) bây giờ nhấp nháy từng dấu vì một số lý do. Đi để thử phương pháp khác.
Logan Klenner

6
Điều này có thể gặp khó khăn nếu văn bản phải được bản địa hóa vì thứ tự được mã hóa cứng.
BlueM

1
Một cách sử dụng khác của phương pháp này là áp dụng các kiểu khác nhau cho mỗi ràng buộc
Hamid Naeemi

câu trả lời hay nhất cho năm 2019
Fábio BC Souza

23

Nếu đây chỉ là các ràng buộc văn bản (và do đó ràng buộc một chiều) và bạn chỉ muốn nối các giá trị, chỉ cần liên kết hai khóa văn bản và đặt chúng vào một ngăn xếp ngang.

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>

Điều đó sẽ hiển thị văn bản (đó là tất cả các Textblocks làm) mà không phải thực hiện thêm bất kỳ mã hóa nào. Bạn có thể đặt một lề nhỏ trên chúng để làm cho chúng trông đúng.


11

Sử dụng ValueConverter

[ValueConversion(typeof(string), typeof(String))]
public class MyConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0}:{1}", (string) value, (string) parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return DependencyProperty.UnsetValue;
    }
}

và trong đánh dấu

<src:MyConverter x:Key="MyConverter"/>

. . .

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />

Có - điều này đã được viết 6 năm trước và bạn đang ràng buộc "Tên" làm đối số đầu tiên cho trình chuyển đổi (được gọi là giá trị trong mã) và ID (một chuỗi từ câu hỏi) làm đối số thứ hai.
Tăng trước
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.