MVVMCROSS จัดการการอัปเดตเมื่อใช้การเชื่อมโยงครั้งเดียวโดยการถ่ายโอนข้อมูลจาก ViewModel ไปยังมุมมองเพียงครั้งเดียวเมื่อตั้งค่าการเชื่อมโยงในขั้นต้น หลังจากการถ่ายโอนครั้งแรกนี้การเชื่อมโยงไม่ได้ตรวจสอบการเปลี่ยนแปลงข้อความหรือเหตุการณ์จาก ViewModel อย่างแข็งขัน ดังนั้นการเปลี่ยนแปลงใด ๆ ที่ตามมาในคุณสมบัติของ ViewModel จะไม่ถูกสะท้อนในมุมมองเว้นแต่แหล่งที่มาของตัวเองจะถูกรีเซ็ตหรือ reinitialized
ประเด็นสำคัญของการผูกมัดครั้งเดียวใน MVVMCROSS:
1. การถ่ายโอนข้อมูลเริ่มต้น: การถ่ายโอนข้อมูลจาก ViewModel ไปยังมุมมองเมื่อมีการสร้างการเชื่อมโยงครั้งแรก โดยทั่วไปแล้วจะมีประโยชน์สำหรับฟิลด์ที่กำหนดค่าได้ แต่ไม่เปลี่ยนแปลงบ่อยหลังจากตั้งค่า
2. ไม่มีการตรวจสอบอย่างต่อเนื่อง: แตกต่างจากการผูกสองทางหรือทางเดียวการผูกครั้งเดียวไม่ได้ตรวจสอบ ViewModel อย่างต่อเนื่องสำหรับการเปลี่ยนแปลง ซึ่งหมายความว่าหากคุณสมบัติของ ViewModel เปลี่ยนไปหลังจากการเชื่อมโยงเริ่มต้นมุมมองจะไม่ได้รับการอัปเดตโดยอัตโนมัติ
3. กรณีการใช้งาน: การผูกมัดครั้งเดียวมักใช้ในสถานการณ์ที่ข้อมูลมีการเปลี่ยนแปลงหรือไม่ค่อยมีการเปลี่ยนแปลงเช่นการตั้งค่าข้อความคงที่จากไฟล์ภาษา เมื่อเลือกภาษาแล้วมันเป็นเรื่องแปลกสำหรับผู้ใช้ที่จะเปลี่ยนบ่อยครั้งทำให้การผูกมัดครั้งเดียวเหมาะสำหรับกรณีดังกล่าว [1]
4. การรีเซ็ตแหล่งที่มาที่มีผลผูกพัน: หากแหล่งที่มามีการรีเซ็ตหรือ reinitialized การเชื่อมโยงครั้งเดียวจะถ่ายโอนข้อมูลใหม่จาก ViewModel ไปยังมุมมองอีกครั้ง อย่างไรก็ตามสิ่งนี้ต้องการการดำเนินการที่ชัดเจนเพื่อรีเซ็ตแหล่งที่มาที่มีผลผูกพัน
5. ข้อ จำกัด ในมุมมองแบบไดนามิก: ในมุมมองแบบไดนามิกเช่นที่ใช้ `mvxrecyclerview` การผูกครั้งเดียวอาจไม่ทำงานตามที่คาดไว้หากมุมมองถูกนำกลับมาใช้ใหม่ ในกรณีเช่นนี้การเชื่อมโยงอาจถูกประเมินอีกครั้งเนื่องจากมุมมองถูกนำมาใช้ซ้ำซึ่งสามารถนำไปสู่พฤติกรรมที่ไม่คาดคิด [6]
โดยสรุปการเชื่อมโยงครั้งเดียวของ MVVMcross ได้รับการออกแบบมาสำหรับสถานการณ์ที่ตั้งค่าข้อมูลหนึ่งครั้งและไม่จำเป็นต้องได้รับการปรับปรุงแบบไดนามิก มันทำให้โครงสร้างพื้นฐานที่มีผลผูกพันง่ายขึ้นโดยการหลีกเลี่ยงการตรวจสอบอย่างต่อเนื่องของ ViewModel สำหรับการเปลี่ยนแปลง แต่ต้องใช้การแทรกแซงด้วยตนเองเพื่ออัปเดตมุมมองหากข้อมูลของ ViewModel เปลี่ยนไปหลังจากการเชื่อมโยงเริ่มต้น
การอ้างอิง:[1] https://www.mvvmcross.com/documentation/fundamentals/data-binding
[2] https://www.mvvmcross.com/documentation/fundamentals/dependency-injection
[3] https://learn.microsoft.com/en-us/dotnet/maui/xaml/fundamentals/mvvm?view=net-maui-9.0
[4] https://stackoverflow.com/questions/46558177/MVVMCROSS--UPTION
[5] https://blog.ostebaronen.dk/2018/01/mvvmcross-binding-target.html
[6] https://stackoverflow.com/questions/48910503/binding-mode-onetime-in-mvxrecyclerview
[7] https://github.com/mvvmcross/mvvmcross/issues/87
[8] https://learn.microsoft.com/en-us/archive/msdn-magazine/2014/march/async-programming-patterns-for-asynchronous-mvvm-applications-data-binding
[9] https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/binding-mode?view=net-maui-9.0
[10] https://www.reddit.com/r/dotnetmaui/comments/103ai8p/mvvm_problems_having_troubles_with_data_bindings/
[11] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup