วิธีการผูกหลายค่ากับ WPF TextBlock เดียว?


210

ฉันกำลังใช้TextBlockด้านล่างเพื่อผูกค่าของคุณสมบัติที่ชื่อName:

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

ตอนนี้ผมต้องการที่จะผูกอีกคุณสมบัติที่มีชื่อเดียวกันIDTextBlock

เป็นไปได้หรือไม่ที่จะผูกสองค่าขึ้นไปเหมือนกันTextBlock? มันสามารถทำได้ด้วยการเรียงต่อกันอย่างง่ายเช่นName + IDและถ้าไม่วิธีนี้สามารถเข้าหาได้อย่างไร

คำตอบ:


434

คุณสามารถใช้การMultiBindingรวมกับStringFormatคุณสมบัติ การใช้งานจะมีลักษณะดังต่อไปนี้:

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

ให้Nameค่าของFooและIDค่าของ1การส่งออกของคุณใน TextBlock Foo + 1แล้วก็จะ

Note: สิ่งนี้ได้รับการสนับสนุนใน. NET 3.5 SP1 และ 3.0 SP2 หรือใหม่กว่าเท่านั้น


5
@Preet - จริง ๆ แล้วฉันไม่แน่ใจถ้า '{}' เป็นสิ่งที่จำเป็นในกรณีนี้ฉันรวมมันไว้ตั้งแต่ใช้กับตัวอย่าง MSDN อย่างไรก็ตามโดยทั่วไปจำเป็นต้องใช้เป็นลำดับการยกเว้นสำหรับตัวแยกวิเคราะห์ XAML เพื่อหลีกเลี่ยงความสับสนกับส่วนขยายมาร์กอัปการผูก
Richard McGuire

2
มีผลกระทบด้านหนึ่งต่อสิ่งนี้ หากคุณใช้วิธีนี้ในสิ่งที่ชอบDataGridพฤติกรรมการเรียงลำดับโชคไม่ดี วิธีแก้ปัญหาที่เหมาะสมกว่าคือการสร้างคุณสมบัติแบบอ่านอย่างเดียวในรูปแบบของคุณด้วยรูปแบบสตริงที่เหมาะสมเพื่อเชื่อมโยง ไม่จำเป็นต้องบอกว่านี่เป็นวิธีที่เรียบร้อยในการจัดรูปแบบอย่างรวดเร็วแม้ว่าจะเป็น verbose เล็กน้อย
Brett Ryan

34
คุณต้องการ {} เมื่อสตริงรูปแบบเริ่มต้นด้วยพารามิเตอร์ {0} ไม่จำเป็นหากสตริงรูปแบบเริ่มต้นด้วยข้อความ เช่น: "{} {0} + {1}" "หน้า {0} จาก {1}"
Dakianth

มันใช้งานไม่ได้กับโครงการ WPF .Net 4.0 Visual Studio 2017
Sorush

@ โซลูชันของ Patrick ทำงานได้ดีสำหรับฉัน ฉันไม่สามารถทำงานนี้ได้ ฉันมีข้อผิดพลาดนี้XamlParseException: 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

ฉันรู้ว่านี่สายไปแล้ว แต่ฉันคิดว่าฉันจะเพิ่มอีกวิธีหนึ่งในการทำสิ่งนี้

คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าคุณสมบัติข้อความสามารถตั้งค่าโดยใช้ " Run s" เพื่อให้คุณสามารถตั้งค่าการเชื่อมหลายรายการโดยใช้ Run สำหรับแต่ละรายการ สิ่งนี้มีประโยชน์หากคุณไม่สามารถเข้าถึง MultiBinding (ซึ่งฉันไม่พบเมื่อพัฒนาสำหรับ Windows Phone)

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

4
นี่เป็นวิธีที่สะดวกมากในการใช้เมื่อเชื่อมโยงกับสตริงต่างๆที่มีที่มาเป็น DynamicResource เนื่องจากคุณไม่สามารถใช้ MultiBinding กับ StringFormat ได้
slugster

ฉันแค่ลองสิ่งนี้ มันใช้งานได้อย่างไรก็ตามองค์ประกอบทุกอย่าง (แม้กระทั่งรูปทรงเรขาคณิต) ที่ได้รับการวาด (ในการรีเฟรช) จะกระพริบเห็บแต่ละเห็บด้วยเหตุผลบางอย่าง ลองใช้วิธีอื่น
Logan Klenner

6
สิ่งนี้อาจทำได้ยากหากข้อความต้องถูกแปลเป็นภาษาท้องถิ่นเนื่องจากคำสั่งซื้อนั้นเป็นรหัสฮาร์ดคอร์
BlueM

1
การใช้วิธีนี้อีกวิธีหนึ่งคือการใช้สไตล์ที่แตกต่างกันในแต่ละการเชื่อมโยง
Hamid Naeemi

คำตอบที่ดีที่สุดสำหรับปี 2019
Fábio BC Souza

23

หากสิ่งเหล่านี้เป็นเพียงเท็กซ์บล็อก (และเชื่อมโยงกันในทิศทางเดียว) และคุณต้องการเชื่อมต่อค่าเพียงผูกสองเท็กซ์บล็อกและวางไว้ในสแต็กแผงแนวนอน

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

ที่จะแสดงข้อความ (ซึ่งเป็น Textblocks ทั้งหมดทำ) โดยไม่ต้องทำการเข้ารหัสอีกต่อไป คุณอาจวางขอบเล็กน้อยเพื่อทำให้มันดูถูก


11

ใช้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;
    }
}

และในมาร์กอัป

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

. . .

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

ใช่ - สิ่งนี้เขียนเมื่อ 6 ปีที่แล้วและคุณผูก "ชื่อ" เป็นอาร์กิวเมนต์แรกของตัวแปลง (เรียกว่าค่าในรหัส) และ ID (สตริงจากคำถาม) เป็นอาร์กิวเมนต์ที่สอง
Preet Sangha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.