2010-01-21 38 views
6
  • Bộ sưu tập bị ràng buộc trong Chế độ xem WPF phải được cập nhật trên chuỗi giao diện người dùng.
  • ViewModel cho thấy một bộ sưu tập
  • Vì vậy khi bộ sưu tập trong ViewModel được sửa đổi nó phải được thực hiện trong thread UI
  • thực hành tốt nhất là để giữ ViewModels không biết gì về Xem và chi tiết có lẽ như Dispatcher.

Cách sạch nhất để giải quyết vấn đề này trong khi vẫn giữ nguyên mô hình xem là gì?Giao diện người dùng Threading với Chế độ xemMô hình

Trả lời

1

Bạn đang ở trong đó WPF cung cấp cho chúng tôi một Dispatcher để làm cho đa luồng đơn giản; nhưng nếu bạn muốn tách riêng các mối quan tâm với mẫu MVVM, bạn sẽ cần triển khai một chiến lược luồng khác nhau.

Tôi luôn tìm thấy lớp BackgroundWorker quá đủ để đáp ứng điều này, đẩy cập nhật về chuỗi giao diện người dùng, sao cho bạn có thể cập nhật ObservableCollection trong máy ảo và thay đổi tuyên truyền cho chế độ xem.

3

Một tùy chọn ở đây là để hiển thị SynchronizationContext có thể sử dụng được từ bên trong Chế độ xem. Đây là cơ chế mà lớp BackgroundWorker sử dụng để đồng bộ hóa với giao diện người dùng mà không giới thiệu một phụ thuộc vào WPF hoặc Windows Forms và cho phép nó hoạt động với nhiều công nghệ.

Điều này sẽ cho phép bạn sắp xếp lại luồng giao diện người dùng mà không tham chiếu đến giao diện người dùng, bao gồm cả Người điều phối.

+0

Không phải là một ý tưởng tồi, nhưng tôi tự hỏi về tính linh hoạt của SyncContext, tác động của việc phụ thuộc vào nó vv ... Bất kỳ suy nghĩ? – Schneider

+0

Nó có một chút "mẫu số chung nhỏ nhất", nhưng Send() và Post() cung cấp chức năng cần thiết, và nó không ép buộc sự phụ thuộc vào bất kỳ khung công cụ cụ thể nào. Như tôi đã đề cập, đây là cách BackgroundWorker có thể hoạt động với WPF + Win FOrms mà không có sự phụ thuộc. –

0

Một tùy chọn là tạo một lớp con của ObservableCollection ghi đè OnPropertyChanged và OnCollectionChanged và gửi các sự kiện thích hợp trở lại luồng giao diện người dùng (thông qua một cái gì đó như SynchronizationContext).

Điều này cho phép ViewModel trở nên bất khả tri hơn khi nói đến luồng, nó làm cho mã trong thử nghiệm cũng dễ quản lý hơn rất nhiều.

+0

Tôi biết các giải pháp chung cho vấn đề này ... câu hỏi của tôi là cụ thể về MVVM và toàn bộ việc giữ cho ViewModel rõ ràng về loại điều này. Cho đến nay nó trông giống như VM cần phải có kiến ​​thức về Sync/Threading – Schneider

+0

Exacltly, bạn sẽ không thể loại bỏ hoàn toàn kiến ​​thức về luồng từ ViewModel. Nhưng nó có thể được "ẩn" bởi một ViewModel cơ bản và một lớp con của ObservableCollection. Bằng cách này, ViewModel (ViewAccountsViewModel chẳng hạn) sẽ là bất khả tri về luồng và do đó có thể kiểm tra được nhiều hơn. –

1

Điều này được giải quyết khá tốt bằng cách tóm tắt tất cả logic của bạn về việc thêm/xóa/cập nhật quan sát + bất kỳ logic phức tạp nào khác trong kịch bản của bạn xảy ra trên các chuỗi khác nhau.

Lớp trình điều khiển này có thể chịu trách nhiệm cập nhật ViewModel (Nó có thể có tham chiếu đến VM theo giao diện) trên luồng chính xác.

+1

Chăm sóc để đưa ra một ví dụ chi tiết hơn? – Schneider

+0

Khó làm trong Stack Overflow. Bạn có thể tưởng tượng một lớp điều khiển có tất cả sự tương tác phức tạp với mô hình trong đó. Là một thuộc tính của bộ điều khiển này, là ViewModel cho ràng buộc.Bộ điều khiển có thể phản ứng với dữ liệu trên các luồng khác nhau, so sánh với luồng UI và sau đó chỉ cần thiết lập các thuộc tính trên ViewModel vì nó có tham chiếu đến nó. Ngoài ra, bất kỳ lệnh nào được thực thi trên ViewModel cũng có thể được truyền lên thông qua các sự kiện tới controller. cho nó để đẩy hành động đến một chủ đề khác (nếu cần) –

+1

Không có nhiều ví dụ về ModelViewViewModelController như vậy trên web, nhưng âm thanh như nó có tiềm năng – Schneider

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