MVVMcross xử lý các bản cập nhật khi sử dụng liên kết một lần bằng cách chuyển dữ liệu từ chế độ xem sang chế độ xem một lần, khi nguồn liên kết ban đầu được đặt. Sau khi chuyển ban đầu này, ràng buộc không chủ động giám sát các thông điệp hoặc sự kiện thay đổi từ ViewModel. Do đó, bất kỳ thay đổi tiếp theo nào đối với thuộc tính của ViewModel sẽ không được phản ánh trong chế độ xem trừ khi chính nguồn liên kết được đặt lại hoặc tái tạo.
Các điểm chính của ràng buộc một lần trong MVVMCROSS:
1. Chuyển dữ liệu ban đầu: Các liên kết chuyển dữ liệu từ chế độ xem sang chế độ xem khi liên kết được thiết lập đầu tiên. Điều này thường hữu ích cho các trường có thể định cấu hình nhưng không thay đổi thường xuyên sau khi chúng được đặt.
2. Không có giám sát liên tục: Không giống như các ràng buộc hai chiều hoặc một chiều, các ràng buộc một lần không liên tục theo dõi chế độ xem cho các thay đổi. Điều này có nghĩa là nếu thuộc tính của ViewModel thay đổi sau khi ràng buộc ban đầu, chế độ xem sẽ không được cập nhật tự động.
3. Các trường hợp sử dụng: Liên kết một lần thường được sử dụng trong các kịch bản trong đó dữ liệu tĩnh hoặc hiếm khi thay đổi, chẳng hạn như đặt văn bản tĩnh từ các tệp ngôn ngữ. Khi một ngôn ngữ được chọn, người dùng không thường xuyên thay đổi nó thường xuyên, làm cho ràng buộc một lần phù hợp với các trường hợp như vậy [1].
4. Đặt lại nguồn liên kết: Nếu nguồn liên kết được đặt lại hoặc tái định cư, liên kết một lần sẽ chuyển dữ liệu mới từ chế độ xem sang chế độ xem. Tuy nhiên, điều này đòi hỏi hành động rõ ràng để thiết lập lại nguồn liên kết.
5. Hạn chế Trong các chế độ xem động: Trong các chế độ xem động, chẳng hạn như các chế độ sử dụng `mvxrecyclerview`, các ràng buộc một lần có thể không hoạt động như mong đợi nếu các chế độ xem được tái chế. Trong những trường hợp như vậy, ràng buộc có thể được đánh giá lại khi các quan điểm được sử dụng lại, điều này có thể dẫn đến hành vi bất ngờ [6].
Tóm lại, ràng buộc một lần của MVVMcross được thiết kế cho các kịch bản trong đó dữ liệu được đặt một lần và không cần phải được cập nhật một cách linh hoạt. Nó đơn giản hóa cơ sở hạ tầng ràng buộc bằng cách tránh theo dõi liên tục ViewModel để thay đổi, nhưng nó đòi hỏi sự can thiệp thủ công để cập nhật xem nếu dữ liệu của ViewModel thay đổi sau khi ràng buộc ban đầu.
Trích dẫn:[1] https://www.mvvmcross.com/documentation/fundaments/data-binding
[2] https://www.mvvmcross.com/Documentation
[3] https://learn.microsoft.com/en-us/dotnet/maui/xaml/fundamentals/mvvm?view=net-maui-9.0
[4] https://stackoverflow.com/questions/46558177/mvvmcross-updates-to-bound-property-in-view-not-propagating-to-property-in-viewm
[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
.
[11] https://www.mvvmcross.com/documentation/advanced/customizing-using-App-and-Setup