Tôi thích nghĩ về nó theo cách này:
Các lượt xem, như bạn nói, thật ngu ngốc. Josh Smith, nhà văn của bài báo MSDN nổi tiếng và thường được liên kết trên MVVM, đã nói rằng lượt xem là "trang phục mà dữ liệu mặc." Các khung nhìn không bao giờ thực sự chứa dữ liệu hoặc thao tác trực tiếp với nó, chúng chỉ bị ràng buộc với các thuộc tính và lệnh của các mô hình xem của bạn.
Mô hình là các đối tượng mô hình hóa miền ứng dụng của bạn , như trong các đối tượng kinh doanh. Ứng dụng của bạn có phải là một cửa hàng âm nhạc không? Có lẽ đối tượng mô hình của bạn sẽ là nghệ sĩ, album và bài hát. Ứng dụng của bạn có phải là trình duyệt biểu đồ tổ chức không? Có lẽ đối tượng mô hình của bạn sẽ là người quản lý và nhân viên. Các đối tượng mô hình này không liên quan đến bất kỳ loại kết xuất trực quan nào và thậm chí chúng không liên quan trực tiếp đến ứng dụng bạn đang đưa chúng vào - các đối tượng mô hình của bạn phải hoàn toàn có ý nghĩa như một họ các đối tượng đại diện cho một số loại của miền. Lớp mô hình cũng thường bao gồm những thứ như bộ truy cập dịch vụ.
Điều này đưa chúng ta đến Viewmodels. Họ là ai? Chúng là những đối tượng mô hình hóa ứng dụng GUI, nghĩa là chúng cung cấp dữ liệu và chức năng để các lượt xem sử dụng. Chúng là những gì xác định cấu trúc và hành vi của ứng dụng thực tế mà bạn đang xây dựng. Đối với các đối tượng mô hình, miền là bất kỳ miền nào bạn chọn (cửa hàng nhạc, trình duyệt biểu đồ tổ chức, v.v.), nhưng đối với mô hình xem, miền là một ứng dụng đồ họa. Các mô hình xem của bạn sẽ đóng gói hành vi và dữ liệu của mọi thứ mà ứng dụng của bạn thực hiện. Chúng sẽ hiển thị các đối tượng và danh sách dưới dạng thuộc tính, cũng như những thứ như Lệnh. Một lệnh chỉ là một hành vi (đơn giản nhất là một cuộc gọi phương thức) được gói gọn trong một đối tượng mang nó - ý tưởng này rất quan trọng bởi vì các khung nhìn được điều khiển bởi databinding, gắn các điều khiển trực quan vào các đối tượng. Trong MVVM, bạn không cung cấp cho một nút là phương thức xử lý Nhấp chuột,
Đối với tôi, những điều khó hiểu nhất là:
- Mặc dù các mô hình xem là mô hình của một ứng dụng đồ họa, chúng không tham chiếu trực tiếp hoặc sử dụng các khái niệm trực quan. Ví dụ: bạn không muốn tham chiếu đến các điều khiển Windows trong ViewModels của mình - những thứ đó sẽ xuất hiện trong chế độ xem. ViewModels chỉ đơn giản là hiển thị dữ liệu và hành vi cho các điều khiển hoặc các đối tượng khác sẽ liên kết với chúng. Ví dụ - bạn có một dạng xem với ListBox trong đó không? Viewmodel của bạn gần như chắc chắn sẽ có một số loại bộ sưu tập trong đó. Chế độ xem của bạn có nút không? Khung nhìn của bạn gần như chắc chắn sẽ có một số lệnh trong đó.
- Có một số loại đối tượng có thể được coi là "mô hình khung nhìn". Loại mô hình xem đơn giản nhất để hiểu là loại mô hình trực tiếp đại diện cho điều khiển hoặc màn hình trong mối quan hệ 1: 1, như trong "màn hình XYZ có một hộp văn bản, một hộp danh sách và ba nút, vì vậy mô hình xem cần một chuỗi, một tập hợp, và ba lệnh. " Một loại đối tượng khác phù hợp với lớp viewmodel là một lớp bao bọc xung quanh đối tượng mô hình để cung cấp cho nó hành vi và làm cho nó dễ sử dụng hơn đối với một chế độ xem - đây là nơi bạn đi vào khái niệm về các lớp view model "dày" và "mỏng". Lớp mô hình xem "mỏng" là một tập hợp các mô hình xem hiển thị các đối tượng mô hình của bạn trực tiếp với các khung nhìn, có nghĩa là các khung nhìn sẽ liên kết trực tiếp với các thuộc tính trên các đối tượng mô hình. Điều này có thể hoạt động đối với những thứ như chế độ xem đơn giản, chỉ đọc, nhưng nếu bạn muốn có hành vi liên kết với từng đối tượng? Bạn không muốn điều đó trong mô hình, bởi vì mô hình không liên quan đến ứng dụng, nó chỉ liên quan đến miền của bạn. Bạn có thể đặt nó vào một đối tượng bao bọc đối tượng mô hình của bạn và cung cấp dữ liệu và hành vi thân thiện với ràng buộc hơn. Đối tượng trình bao bọc này cũng được coi là một mô hình xem, và việc có chúng dẫn đến một lớp mô hình xem "dày hơn", nơi các chế độ xem của bạn không bao giờ kết thúc trực tiếp với bất kỳ thứ gì trên một lớp mô hình. Bộ sưu tập sẽ chứa các mô hình xem bao bọc các mô hình thay vì chỉ chứa các mô hình. Bạn có thể đặt nó vào một đối tượng bao bọc đối tượng mô hình của bạn và cung cấp dữ liệu và hành vi thân thiện với ràng buộc hơn. Đối tượng trình bao bọc này cũng được coi là một mô hình xem và việc có chúng dẫn đến một lớp mô hình xem "dày hơn", nơi các chế độ xem của bạn không bao giờ kết thúc trực tiếp với bất kỳ thứ gì trên một lớp mô hình. Bộ sưu tập sẽ chứa các mô hình xem bao bọc các mô hình thay vì chỉ chứa các mô hình. Bạn có thể đặt nó vào một đối tượng bao bọc đối tượng mô hình của bạn và cung cấp dữ liệu và hành vi thân thiện với ràng buộc hơn. Đối tượng trình bao bọc này cũng được coi là một mô hình xem, và việc có chúng dẫn đến một lớp mô hình xem "dày hơn", nơi các chế độ xem của bạn không bao giờ kết thúc trực tiếp với bất kỳ thứ gì trên một lớp mô hình. Bộ sưu tập sẽ chứa các mô hình xem bao bọc các mô hình thay vì chỉ chứa các mô hình.
Lỗ hổng sâu hơn - có rất nhiều thành ngữ để tìm ra như ValueConverters giúp MVVM hoạt động và có rất nhiều điều để áp dụng khi bạn bắt đầu nghĩ về những thứ như Blendability, thử nghiệm và cách truyền dữ liệu xung quanh ứng dụng của bạn và đảm bảo rằng mỗi viewmodel có quyền truy cập vào hành vi mà nó cần (đây là nơi đưa vào phụ thuộc), nhưng hy vọng phần trên là một khởi đầu tốt. Điều quan trọng là nghĩ về hình ảnh của bạn, miền của bạn và cấu trúc và hành vi của ứng dụng thực tế của bạn như ba điều khác nhau.