Cách tiếp cận chung là có thuộc tính Bộ điều phối trên mô hình chế độ xem của bạn (có thể trong lớp cơ sở cho tất cả các kiểu xem) có thể được chèn bên ngoài. Bạn có thể xem nó trong mô hình xem vì mô hình xem NÊN phải biết về các khái niệm giao diện người dùng, nhưng không nên nhận thức được chế độ xem cụ thể (bố cục, điều khiển, v.v.) và chắc chắn không nên có tham chiếu đến chế độ xem.
Điều bạn có thể làm là bạn có thể dễ dàng gửi mã của mình đến chuỗi của Người gửi điều phối bằng cách tạo người trợ giúp hoặc dịch vụ sẽ trừu tượng điều phối viên. Ví dụ, bạn có thể tạo ra một helper như thế này:
public class AsyncHelper
{
public static void EnsureUIThread(Action action)
{
if (Application.Current != null && !Application.Current.Dispatcher.CheckAccess())
{
Application.Current.Dispatcher.BeginInvoke(action, DispatcherPriority.Background);
}
else
{
action();
}
}
}
Và bất cứ khi nào bạn cần phải cập nhật cho bạn bộ sưu tập quan sát, bạn quấn bạn mã trong đó phương pháp helper:
AsyncHelper.EnsureUIThread(() =>
{
// Update you observable collections here
});
OR, bạn có thể đi xa hơn và sử dụng AOP (ví dụ: PostSharp) để chỉ định khai báo (sử dụng các thuộc tính) rằng một phương thức sẽ được thực hiện trong chuỗi giao diện người dùng.
Và cuối cùng, xin lưu ý rằng bạn chỉ phải gửi các bản cập nhật bộ sưu tập đến chuỗi giao diện người dùng. Các thuộc tính thông thường có thể được cập nhật một cách an toàn từ một chuỗi nền. Các cập nhật sẽ tự động được gửi đến luồng giao diện người dùng bằng cơ chế ràng buộc. Có lẽ trong các phiên bản tương lai của bản cập nhật WPF cho một bộ sưu tập từ một chủ đề nền cũng sẽ được hỗ trợ.
Nguồn
2011-02-10 10:44:15
+1 vì bạn đã tham chiếu video tuyệt vời trên MVVM từ Jason :). Tôi nghĩ rằng tôi sẽ upvote mọi câu trả lời có chứa một liên kết đến nó. Không thể nhấn mạnh đủ tốt như thế nào. Vâng, và câu trả lời của bạn là chính xác. – Anvaka