Trợ giúp với MVVM phức tạp (nhiều chế độ xem)


18

Tôi cần trợ giúp tạo mô hình xem cho kịch bản sau:

  1. Dữ liệu sâu, phân cấp
  2. Nhiều chế độ xem cho cùng một bộ dữ liệu
  3. Mỗi chế độ xem là một chế độ xem duy nhất, thay đổi linh hoạt, dựa trên lựa chọn hoạt động
  4. Tùy thuộc vào giá trị của một thuộc tính, hiển thị các loại tab khác nhau trong điều khiển tab

nhập mô tả hình ảnh ở đây

Những câu hỏi của tôi:

Tôi có nên tạo một đại diện mô hình xem cho mỗi chế độ xem (VM1, VM2, v.v.) không?

1. Yes:
    a. Should I model the entire hierarchical relationship? (ie, SubVM1, HouseVM1, RoomVM1)
    b. How do I keep all hierarchies in sync? (e.g, adding/removing nodes)

2. No:
    a. Do I use a huge, single view model that caters for all views?

Đây là một ví dụ về một chế độ xem

Hình 1: Nhiều khung nhìn được cập nhật dựa trên phòng hoạt động. Kiểm soát tab thông báo

nhập mô tả hình ảnh ở đây

Hình 2: Phòng hoạt động khác nhau. Nhiều lượt xem được cập nhật. Các mục điều khiển tab đã thay đổi dựa trên thuộc tính của đối tượng.

nhập mô tả hình ảnh ở đây

Hình 3: Loại lựa chọn khác nhau. Toàn bộ thay đổi lượt xem

nhập mô tả hình ảnh ở đây


btw một cái nhìn khác biệt là gì? lỗi đánh máy?
JensG

"Muli view" là một lỗi đánh máy. Tôi có nghĩa là các khung nhìn khác nhau cho cùng một mô hình / mô hình xem. Câu hỏi của tôi là, tôi có nên sửa sang lại / bọc toàn bộ hệ thống phân cấp mô hình cho từng chế độ xem, vì vậy mỗi mô hình chế độ xem chỉ chứa những gì chế độ xem riêng lẻ cần? Hoặc tôi nên tạo một hệ thống phân cấp mô hình khung nhìn duy nhất có chứa các thuộc tính từ tất cả các khung nhìn? Kể từ khi tôi đăng câu hỏi này, tôi đã (may mắn) đủ may mắn để tìm ra những ưu / nhược điểm của hai người, một cách khó khăn. Sẽ cập nhật chủ đề này trong tương lai với chẩn đoán đầy đủ về trải nghiệm của tôi, một khi mọi thứ không quá sôi nổi.
jayars

Hãy nhớ một quy tắc thiết kế là hiển thị những điều chung trước tiên sau đó đi sâu vào chi tiết. nó sẽ để lại cho bạn một chế độ xem nhẹ và nếu người dùng đi sâu hơn thì các chế độ xem mới sẽ xuất hiện. Vì vậy, sử dụng các khung nhìn nhỏ với viewmodel của chúng ngoài. kiểm tra giao diện người dùng thiết kế
Csharls

@jsjslim Tôi rùng mình khi đọc "giữ tất cả các thứ bậc đồng bộ". Tôi nghi ngờ bạn đã đi với nhiều chế độ xem và tôi nghi ngờ bạn đã hối hận (nhưng tôi đã sai trước đây). Vì lợi ích của những độc giả khác, những người có thể có cùng câu hỏi, ít nhất bạn có thể cho chúng tôi một câu trả lời nhanh (ish) không?
Guy Schalnat

2
@ guys-schalnat Đa quan điểm là một yêu cầu. Vấn đề của tôi là cố gắng tìm ra cách xây dựng các mô hình xem. Dự án vẫn đang tiếp diễn và tôi không thể tìm thấy thời gian để viết một bài phân tích đầy đủ. Nhưng tóm lại: Tôi nên bỏ qua cấu trúc mô hình, và tập trung vào các khung nhìn. Sự phức tạp mà tôi gặp phải là tự áp đặt: Tôi muốn sử dụng ràng buộc dữ liệu của WPF rất tệ, tôi đã sửa. Những gì tôi đã làm cuối cùng là tốt, "sao chép / dán / tái cấu trúc" cũ. Thiết kế cuối cùng nổi lên là nhẹ (ít lặp lại), và quan trọng hơn, đã làm việc. Sẽ viết lên một phân tích đầy đủ trong tương lai.
jayars

Câu trả lời:


13

Để trả lời câu hỏi, Có, mỗi chế độ xem nên có Mô hình Chế độ xem riêng. Nhưng không cần phải mô hình hóa toàn bộ hệ thống phân cấp. Chỉ những gì xem cần.

Vấn đề tôi gặp phải với hầu hết các tài nguyên trực tuyến liên quan đến MVVM:

Trong hầu hết các ví dụ, Chế độ xem gần như là ánh xạ 1 đến 1 của Mô hình. Nhưng trong kịch bản của tôi, nơi có các chế độ xem khác nhau cho các khía cạnh khác nhau của cùng một Mô hình, tôi thấy mình bị mắc kẹt giữa hai lựa chọn:

Một mô hình khung nhìn nguyên khối được sử dụng bởi tất cả các mô hình khung nhìn khác

nhập mô tả hình ảnh ở đây

Hoặc một mô hình xem cho mỗi chế độ xem

nhập mô tả hình ảnh ở đây

Nhưng cả hai đều không lý tưởng.

Mô hình Chế độ xem theo định hướng Mô hình (MVM), trong khi sao chép mã thấp, là một cơn ác mộng để duy trì

Mô hình khung nhìn theo hướng xem (VVM) tạo ra các lớp chuyên biệt cao cho mỗi khung nhìn, nhưng chứa các bản sao.

Cuối cùng, tôi đã quyết định rằng có một VM cho mỗi View dễ bảo trì và mã hóa hơn, vì vậy tôi đã sử dụng phương pháp VVM.

Khi mã đang hoạt động, tôi bắt đầu tái cấu trúc tất cả các thuộc tính và hoạt động chung thành dạng hiện tại, cuối cùng của nó:

nhập mô tả hình ảnh ở đây

Trong dạng cuối cùng này, lớp mô hình khung nhìn chung được tạo thành trong mỗi VVM.

Tất nhiên, tôi vẫn phải quyết định những gì được coi là phổ biến / chuyên ngành. Và khi một khung nhìn được thêm / sáp nhập / xóa, số dư này sẽ thay đổi.

Nhưng điều tuyệt vời ở đây là, bây giờ tôi có thể đẩy các thành viên từ phổ biến lên VVM và ngược lại một cách dễ dàng.

Và một lưu ý nhanh liên quan đến việc giữ các đối tượng không đồng bộ:

Có một mô hình xem chung sẽ chăm sóc hầu hết điều này. Mỗi VVM có thể chỉ cần có một tham chiếu đến cùng một Mô hình khung nhìn chung.

Tôi cũng có xu hướng bắt đầu với các phương thức gọi lại đơn giản và phát triển thành sự kiện / người quan sát nếu cần nhiều người nghe phát sinh.

Và đối với các sự kiện thực sự phức tạp (ví dụ: cập nhật xếp tầng bất ngờ), tôi sẽ chuyển sang sử dụng Người hòa giải.

Tôi không né tránh mã nơi một đứa trẻ có tài liệu tham khảo lại cho cha mẹ của nó. Bất cứ điều gì để có được mã làm việc.

Và nếu có cơ hội tái cấu trúc, tôi sẽ nắm lấy nó.

Những bài học tôi học được:

  1. Xấu xí / Mã làm việc> Đẹp / Mã không hoạt động
  2. Dễ dàng hợp nhất nhiều lớp nhỏ hơn là chia nhỏ một lớp lớn

Tôi ước tôi có thể nâng cao điều này hai lần. Đây là một trong những giải thích rõ ràng nhất về các lựa chọn tôi đã thấy.
Con người thông minh

3

Nhìn vào các mô hình của bạn, tôi chắc chắn sẽ khuyên bạn nên tạo cấu trúc phân cấp của ViewModels và nhiều Chế độ xem nhỏ. Và rất có thể bạn sẽ phải mô hình hóa khá nhiều thứ bậc ban đầu.

Để giữ mọi thứ đồng bộ giữa ViewModels, hãy sử dụng các sự kiện hoặc có các thuộc tính cho nhau giữa ViewModels. Đồng bộ hóa giữa Lượt xem và ViewModels phải là thuộc tính thông báo chuẩn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.