โหมดการผูก WPF ต่างๆคืออะไร?


89

ฉันไม่เข้าใจโหมดการผูกข้อมูลต่างๆใน WPF เช่น:

  • ทางเดียว
  • สองทาง
  • ครั้งหนึ่ง
  • ฯลฯ ...

แต่ละโหมดเหล่านี้หมายถึงอะไร?

ควรใช้เมื่อใด

คำตอบ:


162
  • OneWay: ใช้สิ่งนี้เมื่อคุณต้องการให้คุณสมบัติที่ถูกผูกไว้เพื่ออัพเดตอินเทอร์เฟซผู้ใช้
  • TwoWay: มีพฤติกรรมเดียวกันOneWayและOneWayToSourceรวมกัน คุณสมบัติที่ถูกผูกไว้จะอัพเดตอินเทอร์เฟซผู้ใช้และการเปลี่ยนแปลงในอินเทอร์เฟซผู้ใช้จะอัปเดตคุณสมบัติที่ถูกผูกไว้ (คุณจะใช้สิ่งนี้กับ a TextBoxหรือCheckboxตัวอย่าง)
  • OneTime: สิ่งนี้มีลักษณะการทำงานเหมือนกับOneWayยกเว้นว่าจะอัปเดตอินเทอร์เฟซผู้ใช้เพียงครั้งเดียว นี่ควรเป็นตัวเลือกเริ่มต้นของคุณสำหรับการผูก (ด้วยเหตุผลหลายประการฉันจะไม่อธิบายรายละเอียดในที่นี้) คุณควรใช้การผูกประเภทอื่นก็ต่อเมื่อคุณต้องการฟังก์ชันพิเศษเท่านั้น
  • OneWayToSource: นี่คือสิ่งที่ตรงกันข้ามกับOneWay- การเปลี่ยนแปลงค่าอินเทอร์เฟซผู้ใช้อัพเดตคุณสมบัติที่ถูกผูกไว้

หากคุณไม่ระบุอะไรเลยพฤติกรรมจะขึ้นอยู่กับการควบคุมที่คุณใช้

สำหรับข้อมูลเพิ่มเติมโปรดดูที่BindingModeenum ใน MSDN


ขอบคุณ. มันมีประโยชน์ ... แต่กรุณาระบุตัวอย่าง TwoWay ... ฉันต้องการทราบว่ามันสะท้อนรหัสเบื้องหลังอย่างไร
DATT OZA

2
@DATT: "ระบุ" หมายความว่าอย่างไร โดยทั่วไปถ้าคุณตั้งค่า Mode = TwoWay ใน XAML เมื่อคุณเปลี่ยนค่า GUI ระบบจะอัปเดตคุณสมบัติ C # โดยอัตโนมัติ แต่คุณสมบัติของคุณใน code-behind จำเป็นต้องนำไปใช้ในคลาส (เช่น ViewModel) ที่ใช้อินเทอร์เฟซ INotifyPropertyChanged เมื่อ code-behind เปลี่ยนค่าของคุณสมบัติผ่าน set คุณต้องเรียก PropertyChanged เพื่อให้ GUI ได้รับแจ้งการเปลี่ยนแปลงค่าและมันจะอัปเดตตัวเองโดยอัตโนมัติ
Dave

1
หากคุณไม่ได้ระบุอะไรเลยพฤติกรรมจะขึ้นอยู่กับคุณสมบัติที่คุณใช้
Mauro Sampietro

39

การผูกประกอบด้วยสองเอนทิตี:

  1. แหล่งที่มา (โดยทั่วไปคือ ViewModel ในสถานการณ์ MVVM)
  2. เป้าหมาย (การควบคุม UI)

เป้าหมายจะต้องเป็นDependencyObject(สำหรับการรวมเข้ากับการทำงาน) และซอร์สอาจเป็นได้DependencyObjectหรือควรมีกลไกบางอย่างในการเลียนแบบระบบ WPF Binding เกี่ยวกับการเปลี่ยนแปลง ( INotifyPropetyChnagedอินเทอร์เฟซImplemeting )


MVVM แนะนำให้โปรเจ็กต์ ViewModel เป็นอิสระจากการอ้างอิงที่เกี่ยวข้องกับ View ใด ๆ ดังนั้นจึงขอแนะนำให้ใช้INotifyPropertyChangedอินเทอร์เฟซเพื่อทำให้อ็อบเจ็กต์ Source ถูกได้ยินโดยการโยง WPF การผูกเกิดขึ้นระหว่างคุณสมบัติของแหล่งที่มาและคุณสมบัติของเป้าหมาย (ต้องเป็น a DependencyProperty) เช่นTextPropertyของTextBoxคลาสคือคุณสมบัติ DataBound ถึง (พูด) UserNameของโมเดลมุมมอง การผูก WPF มีการผูกสี่ประเภท โปรดจำไว้ว่า Binding รันบนเธรด UI เว้นแต่คุณจะระบุให้รันเป็นอย่างอื่น

  1. OneWay : คุณสมบัติเป้าหมายจะรับฟังคุณสมบัติต้นทางที่กำลังเปลี่ยนแปลงและจะอัปเดตตัวเอง หากคุณเปลี่ยนUserNameคุณสมบัติของ ViewwModel โดยทางโปรแกรมคุณสมบัติจะแสดงในกล่องข้อความ นี่เป็นต้นทุนระดับกลางเนื่องจากระบบการผูกจะเฝ้าดูแหล่งที่มาของการเปลี่ยนแปลงเท่านั้น
  2. TwoWay : คุณสมบัติเป้าหมายจะรับฟังคุณสมบัติต้นทางที่กำลังเปลี่ยนแปลงและจะอัปเดตตัวเอง และคุณสมบัติต้นทางจะรับฟังคุณสมบัติเป้าหมายที่กำลังเปลี่ยนแปลงและจะอัปเดตตัวเอง ทั้งคุณสมบัติTextPropertyและUserNameคุณสมบัติจะยังคงซิงค์กันอยู่และจะอัปเดตซึ่งกันและกันหากมีการเปลี่ยนแปลง สิ่งนี้มีค่าใช้จ่ายสูงที่สุดเนื่องจากระบบการผูกต้องคอยดูการเปลี่ยนแปลงทั้งสองฝ่าย
  3. OneWayToSource : คุณสมบัติ Source จะเปลี่ยนถ้าคุณสมบัติเป้าหมายมีการเปลี่ยนแปลง หากผู้ใช้มีการเปลี่ยนแปลงTextPropertyที่UserNameทรัพย์สินจะใช้เวลาถึงมูลค่าที่เปลี่ยนแปลง นี่เป็นต้นทุนระดับกลางอีกครั้งเนื่องจากระบบการเชื่อมโยงเฝ้าดูTargetสำหรับการเปลี่ยนแปลงเท่านั้น
  4. OneTime : สิ่งนี้เกิดขึ้นเพียงครั้งเดียวในช่วงอายุของ Binding คุณสมบัติTargetจะได้รับการอัพเดตด้วยคุณสมบัติSourceเมื่อการผูกเกิดขึ้น นี้เป็นค่าใช้จ่ายน้อยและเป็นที่แนะนำสำหรับสถานการณ์ที่คุณมีข้อมูลคงที่จะแสดงเช่นLabel, TextBlockฯลฯ

หากคุณไม่ได้กล่าวถึงอะไรเลยทุกคุณสมบัติเป้าหมายจะมีโหมดการเชื่อมโยงเริ่มต้นที่เชื่อมโยงกับตัวมันเอง เช่นTextPropertyของ a TextBoxมีโหมดการโยงเริ่มต้นเป็นTwoWay. สำหรับTextPropertyวิธีTextBlockนี้ก็เป็นวิธีหนึ่ง

ขอแนะนำให้คุณเลือกโหมดที่เหมาะสมเนื่องจากสามารถช่วยลดเวลาแฝงของแอปพลิเคชันโดยเฉพาะอย่างยิ่งในกรณีที่คุณมีการควบคุมจำนวนมากใน UI ของคุณ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ MVVM นี่คือบทความที่เขียนโดยฉัน

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