2009-02-03 42 views
8

Báo cáo vấn đềLàm cách nào để duy trì sự nhất quán giữa mô hình và mô hình xem trong mô hình MVVM?

Tôi đang viết một ứng dụng WPF cơ bản để thay đổi nội dung của tệp cấu hình. Định dạng dữ liệu là một tệp XML có lược đồ. Tôi muốn sử dụng nó như là một dự án học tập cho MVVM, vì vậy tôi đã hợp lệ chia mã vào

  • Mẫu: C# lớp tự động tạo ra từ xsd.exe

  • xem mẫu : Biểu diễn thân thiện với người xem của Mô hình.

  • Xem: XAML và mã trống đằng sau

Tôi hiểu như thế nào xem mẫu có thể làm cho Xem ràng buộc một cách dễ dàng. Tuy nhiên, không phải là để lại View-Model < -> Mô hình ngữ nghĩa rất khó xử? Xsd.exe tạo ra các lớp C# với các mảng cho nhiều phần tử XML. Tuy nhiên, ở cấp V-VM bạn cần Bộ sưu tập có thể quan sát.

Câu hỏi:

Liệu điều này thực sự có nghĩa là tôi phải giữ hai loại bộ sưu tập hoàn toàn khác nhau đại diện cho cùng một dữ liệu trong sự gắn kết?

Thực tiễn tốt nhất để duy trì sự gắn kết giữa Mô hình và Mô hình chế độ xem là gì?

Trả lời

6

Tôi không phải là chuyên gia lớn, nhưng tôi nghĩ đó là trường hợp có. Ý tưởng chung thực sự là truyền bá sự thay đổi giữa khung nhìn và viewModel thông qua Binding, và sau đó giữa ViewModel và Model thông qua các sự kiện (theo hướng Model -> ViewModel) hoặc phụ thuộc (theo hướng khác).

Tôi không biết tiêu chuẩn như thế nào, nhưng sự hiểu biết của tôi về MVVM là ViewModel nên giữ tham chiếu đến mô hình để khi người dùng sửa đổi chế độ xem, ViewModel sẽ gọi mã thích hợp trên mô hình. Một cách khác, Model sẽ tăng các sự kiện khi được sửa đổi, và ViewModel sẽ tự cập nhật cho phù hợp (ViewModel là một người quan sát đối với mô hình).

2

@ Điều này thực sự có nghĩa là tôi phải giữ hai loại bộ sưu tập hoàn toàn khác nhau đại diện cho cùng một dữ liệu trong sự kết hợp?

Tôi nghĩ có. Nó khá nhàm chán, nhưng nó hoạt động khá tốt. Hy vọng rằng, trong tương lai chúng ta cũng sẽ có một trình tạo mã để tạo ra phần ViewModel.

Karl đang làm việc trên rằng: http://karlshifflett.wordpress.com/mvvm/

2

Bạn cần rõ ràng ObservableCollections tại viewmodel như vậy, vâng, bạn sẽ cần hai loại bộ sưu tập hoàn toàn khác nhau trong mô hình và trong viewmodel.

Tôi đã thực hiện một bài viết về cách hoàn tác/làm lại trong MVVM nơi bạn có thể tìm thấy giải pháp khả thi cho điều này. Nó sử dụng cái mà tôi gọi là MirrorCollection: một phù thủy lớp có nguồn gốc ObservableCollection tự động lấy được các mục của anh ta từ một Danh sách (danh sách của mô hình).

Tôi nghĩ rằng đó là một giải pháp thú vị, bạn có thể tìm thấy các bài viết ở đây

Part 1: Using the Viewmodel pattern to provide Undo/Redo in WPF

Part 2: Viewmodelling lists (đây là định nghĩa MirrorCollection)

0

Expose Sự kiện hoặc các đại biểu trong Model và treo với cùng trong ViewModel, khi bao giờ giá trị trong mô hình thay đổi thông báo cho viewmodel thông qua sự kiện hoặc đại biểu và từ Viewmodle bạn có thể cập nhật giao diện người dùng.

Nếu bạn muốn cập nhật từ mô hình xem thành mô hình đơn giản như vậy, chỉ cần gọi một số phương thức chuyển các giá trị mới

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