รายการ <T> กับ BindingList <T> ข้อดี / ข้อไม่ได้เปรียบ


93

ใครสามารถอธิบายความแตกต่างระหว่างทั้งสองสำหรับโครงการของฉัน

ตอนนี้ฉันมีList<MyClass>และตั้งค่า BindingSource เป็นที่และ DataGridView เป็น BindingSource

ฉันได้นำไปใช้IEditableObjectแล้วเมื่อเรียกว่า CancelEdit ฉันจะเปลี่ยนวัตถุของฉันกลับไปเป็นไฟล์Memberwise.Clone()

การเปลี่ยนรายการของฉันเป็น BindingList จะช่วยแก้ปัญหานี้ได้หรือไม่และข้อดีของการใช้ BindingList คืออะไร?

คำตอบ:


124

A List<>เป็นเพียงการปรับขนาดอาร์เรย์ของรายการประเภทที่กำหนดโดยอัตโนมัติพร้อมด้วยฟังก์ชันตัวช่วยสองสามอย่าง (เช่น: sort) เป็นเพียงข้อมูลและคุณน่าจะใช้เพื่อเรียกใช้การดำเนินการกับชุดของวัตถุในแบบจำลองของคุณ

A BindingList<>คือกระดาษห่อหุ้มรอบรายการที่พิมพ์หรือคอลเลกชันซึ่งใช้IBindingListอินเทอร์เฟซ นี่เป็นหนึ่งในอินเทอร์เฟซมาตรฐานที่รองรับการเชื่อมต่อฐานข้อมูลแบบสองทาง ทำงานโดยใช้ListChangedเหตุการณ์ซึ่งจะเพิ่มขึ้นเมื่อคุณเพิ่มลบหรือตั้งค่ารายการ Bound controls จะฟังเหตุการณ์นี้เพื่อที่จะทราบว่าเมื่อใดควรรีเฟรชการแสดงผล

เมื่อคุณตั้งค่า DataSource ของ BindingSource เป็น a List<>ระบบจะสร้างBindingList<>เพื่อรวมรายการของคุณภายใน คุณอาจต้องการห่อรายชื่อของคุณไว้ล่วงหน้าBindingList<>หากคุณต้องการเข้าถึงรายการภายนอก BindingSource แต่อย่างอื่นก็เหมือนกัน คุณยังสามารถสืบทอดจากBindingList<>เพื่อใช้พฤติกรรมพิเศษเมื่อเปลี่ยนรายการ

IEditableObjectถูกจัดการโดย BindingSource มันจะเรียก BeginEdit บนออบเจ็กต์การใช้งานใด ๆ เมื่อคุณเปลี่ยนข้อมูลในการควบคุมที่ถูกผูกไว้ จากนั้นคุณสามารถเรียก EndEdit / CancelEdit บน BindingSource และมันจะส่งต่อไปยังวัตถุของคุณ การย้ายไปยังแถวอื่นจะเรียก EndEdit เช่นกัน


ขณะนี้ด้วยวิธีการ List <T> ของฉันที่เรียก CancelEdit จะไม่ส่งคืนรายการที่กำลังแก้ไขกลับสู่สถานะเดิมด้วยเหตุนี้ฉันจึงใช้ Clone () คุณกำลังบอกว่ารายการผูกมัดจะจัดการให้ฉันหรือไม่?
จอน

3
ไม่ BindingList ไม่มีส่วนเกี่ยวข้องกับฟังก์ชันนั้น BindingSource เพียงแค่เรียก CancelEdit บนวัตถุปัจจุบันโดยไม่คำนึงถึงประเภทของรายการที่อยู่ข้างใต้ ไม่มีอะไรในเฟรมเวิร์กที่ใช้การกำหนดเวอร์ชันอ็อบเจ็กต์สำหรับอ็อบเจ็กต์ธรรมดาโดยอัตโนมัติ คุณสามารถใช้ DataTables / DataRows ซึ่งเก็บสำเนาต้นฉบับของข้อมูลไว้เพื่อจุดประสงค์นี้
Alex J

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

ตัวอย่างเช่น DataGrid จำเป็นต้องทราบเมื่อมีการเพิ่มรายการในรายการของคุณเพื่อเพิ่มแถวใหม่ สำหรับสิ่งนั้นจะใช้เหตุการณ์ ListChanged ของ BindingList หากคุณผูกกริดกับรายการ <T> โดยตรงคุณจะไม่มีเหตุการณ์และกริดจะไม่สามารถรู้ได้ว่าคุณเปลี่ยนรายการ คุณไม่ต้องกังวลเกี่ยวกับเรื่องนี้ในสถานการณ์ของคุณเนื่องจาก BindingSource จะรวมรายการ <T> ไว้ใน BindingList ให้คุณ ตราบใดที่คุณทำงานกับ BindingSource และไม่ใช่รายการเองตัวควบคุมจะยังคงซิงค์อยู่
Alex J

มีวิธีแก้ปัญหาในการใช้ BindingList to WPF UI (วิธี mvvm) หรือไม่ ฉันสามารถรวมรายการที่มีผลผูกพันกับคอลเลกชันที่สังเกตได้ได้หรือไม่?
Lance

13

BindingList อนุญาตการเชื่อมโยงฐานข้อมูลแบบสองทางโดยใช้เหตุการณ์รายการจะไม่เริ่มการทำงานของเหตุการณ์เมื่อคอลเล็กชันเปลี่ยนไป

ฉันไม่คิดว่ามันจะแก้ปัญหาเฉพาะของคุณได้

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