2010-02-01 31 views
11

Tôi đã nghe rất nhiều về các ràng buộc hai chiều trong WPF, nhưng tôi không hoàn toàn rõ ràng về cách thực hiện nó hoặc ý nghĩa của nó.Làm cách nào để hoàn thành việc ràng buộc dữ liệu hai chiều trong WPF?

Tôi có một ListView với một loạt các mục trong đó. Khi người dùng chọn một mục mới, một TextBox trong ứng dụng sẽ thay đổi văn bản của nó để hiển thị một số thuộc tính của mục đã chọn.

Nhưng khi người dùng thay đổi văn bản trong hộp văn bản, tôi muốn mục ListView được cập nhật ngay lập tức. Có cách nào "hai chiều ràng buộc" WPF huyền diệu cách để hoàn thành điều này?

Trả lời

11

Nếu bạn chưa bạn sẽ cần phải thực hiện INotifyPropertyChanged cho lớp học của bạn rằng bạn đang ràng buộc vào.

Ngoài ra, khi bạn nói bạn muốn mục ListBox được cập nhật ngay lập tức, bạn có nghĩa là bạn muốn nó thay đổi khi bạn nhập vào số TextBox. Theo mặc định, TextBox.Text bất động sản cập nhật nguồn của nó khi nó mất tập trung, nhưng bạn có thể thay đổi điều này bằng cách thiết lập các ràng buộc UpdateSourceTrigger để PropertyChanged:

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged} 
+3

Tùy thuộc vào cách thiết lập mọi thứ, Nguồn đó có thể cần phải được thay đổi thành ElementName (với Đường dẫn của SelectedItem.Whatever), hoặc, nếu tập hợp các mục bị ràng buộc là DataContext, có thể được bỏ qua, nhưng trong trường hợp sau ListView sẽ cần IsSynchronizedWithCurrentItem = "True". – itowlson

+0

Nó giống như itowlson nói. Cảm ơn rất nhiều! –

+0

Ahh đúng và cảm ơn bạn đã sửa cú pháp;) –

1

Loại mục trong ListView là gì? Để có được hai cách ràng buộc đi sự cần thiết phải thực hiện INotifyPropertyChanged ...

này có thể giúp WPF event property changed?

+0

Các mục trong chế độ xem danh sách là các đối tượng thực hiện 'INotifyPropertyChanged'. –

+0

Bạn có mẫu mã trông như thế nào không? – anthonyv

33

Mark's answer cho thấy làm thế nào để thực hiện những gì bạn muốn, nhưng bạn cũng có hỏi tổng quát hơn về " làm thế nào để hoàn thành [liên kết hai chiều] và ý nghĩa thực sự của nó. "

Ràng buộc một chiều có nghĩa là mục tiêu ràng buộc (ví dụ: điều khiển) sẽ hiển thị dữ liệu từ nguồn ràng buộc (ví dụ: đối tượng nghiệp vụ) và sẽ tự cập nhật khi thay đổi đối tượng nghiệp vụ, nhưng thay đổi đối với điều khiển sẽ không được lan truyền quay trở lại đối tượng kinh doanh. Ví dụ. nếu Person.Name thay đổi từ "bob" thành "kate", TextBlock.Text bị ràng buộc với Tên sẽ thay đổi từ "bob" thành "kate".

Ràng buộc hai chiều chỉ đơn giản có nghĩa là không chỉ những thay đổi trong đối tượng doanh nghiệp được phản ánh trong giao diện người dùng, mà thay đổi được thực hiện bởi người dùng trong giao diện người dùng cũng được truyền lại cho đối tượng kinh doanh. Vì vậy, bây giờ khi người dùng chỉnh sửa TextBox.Text ràng buộc với tên, nói thay đổi "kate" thành "edmund", WPF sẽ đặt thuộc tính Person.Name thành "edmund".

Để thực hiện việc này, chỉ cần đặt Mode = TwoWay trên khai báo Binding. Một số thuộc tính ràng buộc hai chiều theo mặc định: TextBox.Text, ví dụ, liên kết TwoWay theo mặc định, đó là lý do tại sao mã của Mark không cần khai báo Chế độ. Ngoài ra, như ghi chú Mark, theo mặc định, WPF chỉ truyền các thay đổi trở lại đối tượng nghiệp vụ khi điều khiển mất tiêu điểm. Nếu bạn có hai phần tử giao diện người dùng bị ràng buộc với cùng một thuộc tính, điều này có nghĩa là chúng xuất hiện không đồng bộ, trong trường hợp đó bạn có thể sử dụng UpdateSourceTrigger để buộc WPF truyền bá bất cứ khi nào thuộc tính thay đổi.

MSDN trình bày chi tiết một số biểu đồ rõ ràng: xem Data Binding Overview trong SDK WPF.

+1

Tổng quan về ràng buộc. =) –

+0

Được bỏ phiếu. Đã trải qua hàng tấn kết quả tìm kiếm mà tất cả đã mô tả cách triển khai ràng buộc dữ liệu hai chiều, nhưng không có kết quả nào giải thích khái niệm này. Bài đăng của bạn đã và khá ngắn gọn. –

+0

Cảm ơn điều này, đặc biệt là tuyên bố "Một số thuộc tính ràng buộc hai chiều theo mặc định: TextBox.Text, ví dụ, liên kết TwoWay theo mặc định" Điều này đã giúp rất nhiều :) – sergeantKK

Các vấn đề liên quan