Các chế độ ràng buộc WPF khác nhau là gì?


86

Tôi không hiểu các chế độ liên kết dữ liệu khác nhau trong WPF, chẳng hạn như:

  • Một chiều
  • Hai chiều
  • Một lần
  • Vân vân...

Mỗi chế độ này có ý nghĩa gì?

Khi nào chúng nên được sử dụng?

Câu trả lời:


159
  • OneWay: Sử dụng điều này khi bạn muốn thuộc tính liên kết cập nhật giao diện người dùng.
  • TwoWay: Điều này có hành vi giống như OneWayOneWayToSourcekết hợp. Thuộc tính liên kết sẽ cập nhật giao diện người dùng và những thay đổi trong giao diện người dùng sẽ cập nhật thuộc tính liên kết (Bạn sẽ sử dụng thuộc tính này với một TextBoxhoặc một Checkboxví dụ.)
  • OneTime: Điều này có hành vi giống như OneWayngoại trừ nó sẽ chỉ cập nhật giao diện người dùng một lần. Đây sẽ là lựa chọn mặc định của bạn để ràng buộc (vì nhiều lý do khác nhau mà tôi sẽ không giải thích ở đây), bạn chỉ nên sử dụng các loại ràng buộc khác nếu bạn thực sự cần chức năng bổ sung.
  • OneWayToSource: Điều này ngược lại với OneWay- thay đổi giá trị giao diện người dùng cập nhật thuộc tính ràng buộc.

Nếu bạn không chỉ định bất kỳ điều gì, thì hành vi sẽ phụ thuộc vào điều khiển mà bạn đang sử dụng.

Để biết thêm thông tin, hãy xem BindingModeenum trên MSDN .


Cảm ơn. nó hữu ích ... Nhưng làm ơn chỉ định ví dụ TwoWay ... tôi muốn biết cách nó phản ánh mã phía sau.
DATT OZA

2
@DATT: ý bạn là "chỉ định" là gì? Về cơ bản, nếu bạn đặt Mode = TwoWay trong XAML, khi bạn thay đổi giá trị GUI, nó sẽ tự động cập nhật thuộc tính C #. Nhưng thuộc tính của bạn trong mã phía sau cần được triển khai trong một lớp (như ViewModel) triển khai giao diện INotifyPropertyChanged. Khi mã phía sau thay đổi giá trị của thuộc tính thông qua tập hợp, bạn cần gọi PropertyChanged để GUI được thông báo về sự thay đổi giá trị và nó sẽ tự động cập nhật.
Dave

1
Nếu bạn không chỉ định bất kỳ điều gì, thì hành vi sẽ phụ thuộc vào THUỘC TÍNH mà bạn đang sử dụng.
Mauro Sampietro

37

Một ràng buộc bao gồm hai thực thể:

  1. Nguồn (Điển hình là ViewModel trong các kịch bản MVVM)
  2. Mục tiêu (Điều khiển giao diện người dùng)

Đích phải là một DependencyObject(để ràng buộc hoạt động) và nguồn có thể là một DependencyObjecthoặc nó phải có một số cơ chế để bắt chước hệ thống WPF Binding về việc nó bị thay đổi ( INotifyPropetyChnagedGiao diện thực hiện).


MVVM khuyến nghị dự án ViewModel không có bất kỳ tham chiếu nào liên quan đến View và do đó, bạn nên sử dụng INotifyPropertyChangedgiao diện để làm cho đối tượng Nguồn được nghe bởi liên kết WPF. Ràng buộc xảy ra giữa thuộc tính Nguồn và thuộc tính của Mục tiêu (phải là a DependencyProperty). ví dụ: Thuộc tính TextPropertycủa TextBoxlớp là DataBound đến (giả sử) UserNamecủa mô hình khung nhìn. Liên kết WPF cung cấp bốn loại Ràng buộc. Hãy nhớ rằng, Binding chạy trên chuỗi giao diện người dùng trừ khi bạn chỉ định nó chạy theo cách khác.

  1. OneWay : Thuộc tính đích sẽ lắng nghe thuộc tính nguồn được thay đổi và sẽ tự cập nhật. Nếu bạn thay đổi thuộc tính của ViewwModel theo chương trình UserName, nó sẽ phản ánh trong hộp văn bản. Đây là chi phí trung gian vì hệ thống ràng buộc chỉ xem Nguồn để biết các thay đổi.
  2. TwoWay : Thuộc tính đích sẽ lắng nghe thuộc tính nguồn được thay đổi và sẽ tự cập nhật. VÀ Thuộc tính nguồn sẽ lắng nghe thuộc tính đích được thay đổi và sẽ tự cập nhật. Cả thuộc tính TextPropertyvà thuộc UserNametính sẽ vẫn đồng bộ và sẽ cập nhật lẫn nhau nếu một thuộc tính thay đổi. Điều này là tốn kém nhất vì hệ thống ràng buộc phải theo dõi cả hai bên để thay đổi.
  3. OneWayToSource : Thuộc tính Nguồn sẽ thay đổi nếu thuộc tính đích được thay đổi. Nếu người dùng thay đổi TextProperty, thuộc UserNametính sẽ nhận giá trị đã thay đổi. Điều này một lần nữa là chi phí trung gian vì hệ thống ràng buộc chỉ theo dõi Target cho các thay đổi.
  4. OneTime : Điều này chỉ xảy ra một lần trong suốt thời gian tồn tại của Binding, thuộc tính Target sẽ được cập nhật với thuộc tính Source khi Binding xảy ra. Điều này ít tốn kém nhất và được khuyến khích cho các trường hợp bạn có dữ liệu tĩnh được hiển thị Label, ví dụ , TextBlockv.v.

Nếu bạn không đề cập đến bất cứ điều gì, mọi thuộc tính đích đều có một chế độ ràng buộc mặc định được liên kết với chính nó. Ví dụ: TextPropertycủa a TextBoxcó chế độ ràng buộc mặc định là TwoWay. Đối với TextPropertycủa một TextBlocknó là một cách.

Bạn nên chọn chế độ phù hợp vì nó có thể giúp bạn giảm độ trễ của ứng dụng, đặc biệt là trong trường hợp bạn có nhiều điều khiển trong giao diện người dùng của mình.

Để biết thêm về MVVM, đây là một bài báo do tôi viết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.