2009-07-16 23 views
22

Tôi có một lớp ViewModel có số lượng lớn các thuộc tính (Say 50). Khi dữ liệu được đặt cho tất cả các thuộc tính tôi cần cập nhật giao diện người dùng. Tôi biết rằng giải pháp phổ biến là nâng cao PropertyChanged trên tất cả các người định cư bất động sản.WPF MVVM - Một bản cập nhật PropertyChanged có thể cập nhật tất cả các ràng buộc Dữ liệu của một DataTemplate không?

Tôi tự hỏi liệu có cách nào tôi có thể thông báo cho DataTemplate của mình để cập nhật tất cả các ràng buộc của nó thông qua một thông báo không? Một ý tưởng là có một thuộc tính IsLoaded làm tăng propertychanged nhưng làm thế nào tôi có thể sử dụng nó để cập nhật toàn bộ DataTemplate. Tôi quan tâm đến một giải pháp XAML tổng thể cho việc này.

Trả lời

47

Cuối cùng tôi đã có một câu trả lời từ đồng nghiệp của tôi Josh Smith, nó rất đơn giản, chúng ta chỉ cần đưa ra sự kiện PropertyChanged với null hoặc String.Empty như tên tài sản. sẽ cho hệ thống ràng buộc WPF đánh giá lại tất cả các ràng buộc của đối tượng đó. Tôi đang nhận được hai lợi thế lớn trong khi sử dụng này.

  1. Chi phí phát sinh sự kiện riêng lẻ trên mỗi thuộc tính sẽ giảm xuống chỉ một sự kiện từ Chế độ xem sang giao diện người dùng. Hiệu suất sẽ tăng lên.
  2. Trong khi viết mã, chúng tôi chỉ có thể sử dụng {get; set;} cú pháp đó là sạch và ít viết

Assumption: Như trong câu hỏi tôi cho rằng đây rằng đó là một điều kiện rất đặc biệt, trong đó tất cả Thuộc tính của tôi đang nhận được cập nhật cùng một lúc

tôi có một Update blogpost discussing this here

: dựa trên những nhận xét từ kek444

+8

Từ msdn: "Sự kiện PropertyChanged có thể cho biết tất cả các thuộc tính trên đối tượng đã thay đổi bằng cách sử dụng tham chiếu null (Không có gì trong Visual Basic) hoặc String.Empty làm tên thuộc tính trong PropertyChangedEventArgs."Dòng đầu tiên và tôi đoán gần như tất cả mọi người (bao gồm cả bản thân mình) đã bỏ lỡ nó - doh! –

0

Tôi không nghĩ đây là vấn đề đáng để giải quyết. Đó là, tôi nghĩ rằng giải pháp ở đây là để các thuộc tính cá nhân gửi thông báo thay đổi thuộc tính khi chúng được thiết lập. Nếu không, bạn sẽ làm gì khi một tài sản cá nhân (nhưng không nhất thiết là tất cả năm mươi) thay đổi?

+0

Hãy tưởng tượng tình huống tải một loạt dữ liệu (Tất cả các thuộc tính của DO) từ một Webservice, DataTemplate đang hiển thị một hình động cho đến khi toàn bộ dữ liệu được tải, tôi cần phải cập nhật tất cả trong một lần kích hoạt sự kiện. Tôi giả sử không có Tập hợp riêng lẻ xảy ra –

+0

Liên kết hiển thị hình động với một thuộc tính Đang tải trong ViewModel của bạn và có thuộc tính IsLoading được đặt thành true cho đến khi tất cả dữ liệu được tải. Các thuộc tính cá nhân vẫn có thể kích hoạt các thông báo thay đổi thuộc tính. – jason

+0

Vâng đó là giải pháp MVVM rõ ràng Nhưng những gì tôi đang tìm kiếm là một cái gì đó để làm mới DataContext của mẫu để nó sẽ hiển thị tất cả dữ liệu với một gánh nặng VM –

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