การผูกเทมเพลตกับการผูกคืออะไร?


118

BorderThickness="{TemplateBinding BorderThickness}ฉันไม่เข้าใจ นี่คือรหัส:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

โปรดอธิบายประเภทอื่น ๆ ของการผูกด้วย


ทำไมถึงกลับมาและทำไม BorderThickness จึงเขียน 2 ครั้ง "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi

1
@Euphoric หน้านี้น่าจะเป็นผลลัพธ์แรกของ Google สำหรับข้อความค้นหานั้น ;)
ANeves

คำตอบ:


204

TemplateBinding ใช้สำหรับการเชื่อมโยงกับคุณสมบัติองค์ประกอบภายในข้อกำหนดเทมเพลต ในตัวอย่างของคุณคุณสามารถเขียนได้

 <Border Padding="{Binding Padding}" ...>

หมายถึงการผูกคุณสมบัติช่องว่างของเส้นขอบกับคุณสมบัติช่องว่างของ ... อะไร? คุณต้องการพูดว่า "คุณสมบัติการเติมของตัวควบคุมที่กำลังใช้เทมเพลตนี้" คุณไม่สามารถตั้งชื่อได้เนื่องจากคุณไม่ทราบ x: ชื่อของคอนโทรลในขณะนี้ (แม้ว่าคุณจะทำ แต่ก็ไม่สามารถใช้งานได้เนื่องจากอยู่ในเนมสโคปที่แตกต่างกัน) อย่างไรก็ตามคุณสามารถทำได้โดยกำหนดแหล่งที่มาสัมพัทธ์

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

หรือใช้ TemplateBinding ซึ่งเป็นทางลัด (*) สำหรับด้านบน

<Border Padding="{TemplateBinding Padding}" ...>

(*) นอกจากจะมีรายละเอียดน้อยลงในสถานการณ์จำลองเหล่านี้แล้ว TemplateBinding ยังมีข้อแตกต่างอีกสองสามประการเมื่อเทียบกับการเชื่อมโยงทั่วไป:

  • ได้รับการประเมินตามเวลาคอมไพล์ (ตัวอย่างเช่นหากไม่มีคุณสมบัติ Padding คุณจะได้รับข้อผิดพลาดในการคอมไพล์ แต่ถ้าคุณจะใช้การรวมกับ TemplatedParent คุณจะเห็นข้อผิดพลาดขณะรันไทม์เท่านั้น)
  • เป็นการผูกแบบทางเดียวเสมอ
  • มันต้องมีทั้งแหล่งที่มาและเป้าหมายคุณสมบัติมีคุณสมบัติการพึ่งพา
  • มีฟังก์ชันการทำงานน้อยกว่ามาก (ไม่มี StringFormat, Delay, IsAsync ฯลฯ ดูคุณสมบัติของBinding vs TemplateBindingExtention )

58

ภาพที่มีค่าพันคำ. ในกรณีนี้เป็นวิดีโอ 7 นาที: https://www.youtube.com/watch?v=z-0TZR-7xLI

แก้ไข: ตัวอย่าง:

  • Buttonมีค่าเริ่มต้นControlTemplateทรัพย์สินและHeightสถานที่ให้บริการ
  • คุณลบล้างControlTemplateคุณสมบัติของ a Buttonโดยการเขียนของคุณเอง (ตัวอย่างเช่นคุณต้องการสร้างEllipseปุ่ม -looking แทนRectangle-looking)
  • หลังจากที่คุณสร้างEllipseใหม่ControlTemplateแล้วคุณต้องการEllipseให้มีขนาดเท่ากับHeightคุณสมบัติของปุ่มดั้งเดิม
  • ดังนั้นคุณใช้ TemplateBindingเพื่อการอ้างอิงButton's Heightโดยไม่ต้องตั้งชื่อมันใส่คำอธิบายภาพที่นี่

ในขณะนี้อาจตอบคำถามในทางทฤษฎีได้ แต่ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และระบุลิงก์สำหรับการอ้างอิง
Bhargav Rao

32

Eren Ersönmenzได้อธิบายไว้แล้วค่อนข้างดี แต่ฉันอยากจะให้มุมมองอื่นเพื่อให้เข้าใจแนวคิดนี้ดีขึ้น

ใน WPF ทุกตัวควบคุมจะแยกออกจากงานนำเสนอมากหรือน้อย คุณสามารถเปลี่ยนเทมเพลตของการควบคุมได้ตลอดเวลาและทำให้ดูแตกต่างไปจากเดิมอย่างสิ้นเชิง ปุ่มทำงานตามที่คาดไว้โดยมีControlTemplateเพียงRectangleตัวอย่างเท่านั้น บางครั้งจำเป็นต้องControlTemplateใช้คุณสมบัติของส่วนลอจิกของตัวควบคุม และนั่นTemplateBindingคือสิ่งที่มีไว้เพียงแค่บอกว่าControlTemplate"Use this property of the control we are giving the visual presentation" ตัวอย่างที่ดีคือBackgroundคุณสมบัติในทุกการควบคุมมันไม่มีความหมายในตัวมันเองมันได้รับความหมายจากTemplateBindingการควบคุมเด็กในControlTemplate .

มีผลผูกพันกับของตัวเองมีการอธิบายที่ดีมากในMSDN นี่เป็นแผ่นโกงที่ดีมากซึ่งจริงๆแล้วแขวนอยู่บนผนังข้างๆฉัน จะให้ภาพรวมที่ดีของการผูกต่างๆทั้งหมดที่มีอยู่


6

จากTemplateBinding Markup ขยาย , TemplateBindingการเชื่อมโยงคุณค่าของสถานที่ให้บริการในแม่แบบการควบคุมให้มูลค่าของทรัพย์สินสัมผัสบางส่วนอื่น ๆ ในการควบคุมเทมเพลต คำอื่น ๆ ใช้สำหรับผูกค่าในเทมเพลต

Bindingเชื่อมต่อคุณสมบัติของเป้าหมายที่มีผลผูกพันและแหล่งข้อมูล

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