2010-10-14 23 views
16

Tôi đang cố gắng tìm ra cách tốt nhất để bong bóng các sự kiện PropertyChanged từ các thuộc tính lồng nhau trong ModelView của tôi. Giả sử tôi có ModelView PersonModelView có Thuộc tính PersonModelView.Address. Address lần lượt có một tài sản City. Khi tôi liên kết với City theo quan điểm của tôi, tôi sẽ làm điều gì đó như {Binding Address.City}.Một cách hay để bong bóng sự kiện INotifyPropertyChanged thông qua các thuộc tính ViewModel với MVVM là gì?

Vấn đề của tôi là ngay cả khi Address thực hiện INotifyPropertyChanged, các ràng buộc sẽ không được cập nhật bởi vì nó được xử lý PropertyChanged trên PersonModelView, khôngAddress. Tôi nghĩ rằng tôi có hai lựa chọn: (1) thay đổi nguồn của ràng buộc (hoặc thay đổi DataContext) thành thuộc tính Address hoặc (2) có PersonModelView xử lý PropertyChanged trên đối tượng Address và tự mình khôi phục PropertyChanged riêng của mình với một cái gì đó như Address.City.

Các bạn giải quyết vấn đề này như thế nào? (Tôi đang sử dụng bộ công cụ ánh sáng MVVM tại mo, nhưng tôi quan tâm đến bất kỳ cách tiếp cận nào)

Trả lời

8

Nếu Address triển khai INotifyPropertyChanged và tăng giá một cách chính xác PropertyChanged sự kiện trên thuộc tính City của nó thì ràng buộc sẽ nhận thấy rằng thuộc tính mà nó bị ràng buộc đã thay đổi.

+0

Tôi đồng ý. Tôi chưa bao giờ phải truyền bá các sự kiện khi một lĩnh vực một hoặc hai cấp bị ràng buộc. Hãy thử bắn 'PropertyChanged' với' null' làm tên thuộc tính và đặt một breakpoint trong setter thuộc tính của bạn để đảm bảo ràng buộc hoạt động (hoặc kiểm tra cửa sổ đầu ra). –

+0

Đó là một cứu trợ thực sự, nó sẽ làm cho mã của tôi đẹp hơn nhiều. Tôi đoán tôi đã có một sai lầm khi tôi lần đầu tiên thử điều này, tôi chỉ làm điều đó một lần nữa trong một giải pháp mới và nó hoạt động tốt. Cảm ơn anh em về sự giúp đỡ! – Geoff

1

Đối tượng Address của bạn có thực hiện INotifyPropertyChanged không? Nếu không, tôi nghĩ điều đó sẽ khắc phục được vấn đề mà bạn đang thấy.

Chỉnh sửa: Xin lỗi, chỉ cần lưu ý rằng bạn đã đề cập trong bài đăng mà bạn đã thử điều này. Bạn đã thử đăng ký sự kiện PropertyChanged của đối tượng Địa chỉ trong PersonViewModel của mình chưa? OnChanged, bạn có thể thực hiện một PropertyChanged trên đối tượng Address của bạn.

+0

Có nó. Vì vậy, nên ràng buộc xử lý các sự kiện PropertyChanged trên PersonModelView hoặc Địa chỉ nếu ràng buộc là {Binding Address.City}? (và PersonModelView là DataContext tất nhiên) – Geoff

+0

Bạn có thể gửi mã của bạn? Dường như với tôi rằng cách bạn thiết lập nó sẽ hoạt động. Bạn đã nhìn vào cửa sổ 'Đầu ra' của bạn để đảm bảo rằng nó ràng buộc chính xác? – JSprang

3

Dưới đây là một thread SO chứa một giải pháp làm thế nào để bong bóng lên các thông báo này: When nesting properties that implement INotifyPropertyChanged must the parent object propogate changes?

Tuy nhiên, IIRC WPF có trí thông minh để tự động theo dõi Địa chỉ cho các thông báo INotifyPropertyChanged khi một điều khiển ràng buộc được thiết lập để Address.City không PersonViewModel cần phát lại thông báo cập nhật của đối tượng Địa chỉ.

+0

Ben, bạn có ý định liên kết lại câu hỏi này không? –

+0

Erm, tôi nghĩ đó là liên kết sai;) Phải, tôi phải bỏ lỡ điều gì đó. Tôi nghĩ rằng các ràng buộc không thể xử lý điều đó, trở lại mã cho tôi! – Geoff

+0

Rất tiếc! Cảm ơn vì đã bắt được điều đó. Đã sửa liên kết. –

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