2012-06-29 42 views
6

Dường như có một hướng dẫn rằng một mô hình không nên tiếp xúc với các tổ chức của nó để xem, và rằng tất cả các thuộc tính cần được trùng lặp trong ViewModelMVVM sao chép thuộc tính Model trong ViewModel

Ví dụ:

Product 
Id {get; set;} 
Name {get; set;} 
....... 


ProductViewModel : ViewModelBase 
Id {get; set;} 
Name {get; set;} 
....... 

Tại sao điều này lại được yêu cầu? Tôi có thể hiểu điều này nếu Mô hình không thực hiện INPC, nhưng nếu có, thì tôi thấy điều này khá không cần thiết.

Trả lời

7

Khi Xem là ràng buộc để Model:

  • Nếu Xem cần phải thay đổi hoặc bạn có nhiều quan điểm một sự thay đổi mô hình sẽ gây ra những thay đổi cho tất cả Views ràng buộc để mẫu đó.

  • Từ quan điểm của Chế độ xem, đối tượng được gắn kết có thể không trực quan; khi bạn cần thêm một thuộc tính và/hoặc các lệnh vào đối tượng, bạn có thêm các đối tượng đó vào ViewModel và giữ các thuộc tính 'ban đầu' trong Mô hình hoặc bạn có sửa đổi Mô hình không?

Có một ViewModel mang đến cho bạn một sự trừu tượng thêm giữa một mô hình duy nhất và nhiều (phiên bản) Xem

Tất cả trong tất cả nó chỉ là một phương châm nhưng lưu ý rằng những gì có vẻ OK ngày nay có thể không phải như vậy tuyệt vời khi bạn cần sửa đổi/cập nhật ứng dụng.

+0

Xin chào, từ quan điểm của tôi, mô hình là POCO với INPC – Goran

+0

Rất tiếc, tôi đang gặp khó khăn khi nhập từ điện thoại của mình, tôi sẽ trả lời khi tôi trở về nhà – Goran

+0

Tôi xem Mô hình là bất kỳ thứ gì được cung cấp bởi nguồn bên ngoài (lớp proxy, lưu trữ, dòng) INPC chỉ cần thiết khi tôi muốn View được cập nhật bởi những thay đổi trong những gì được ràng buộc với nó. Tôi không bao giờ ràng buộc các mô hình để xem vì lý do trong câu trả lời của tôi, đó là những gì ViewModel là cho. –

3

Hướng dẫn, chỉ là vậy. Nó phụ thuộc vào tình hình trong tầm tay. Purists sẽ lập luận rằng việc tách mô hình hoàn toàn khỏi khung nhìn cho phép mô hình thay đổi mà không thay đổi quan điểm.

tôi có xu hướng để chỉ tính chất mô hình proxy nếu tôi phải (hoặc INPC hoặc một số logic xem cụ thể như mô hình có FirstName và LastName nhưng không FullName)

Nếu tôi liên kết với Model (mà là một tài sản công cộng trên ViewModel). Nếu tình hình của tôi thay đổi và tôi cần phải đóng gói một cái gì đó sau đó tôi refactor khi tôi có một nhu cầu.

Tôi luôn cố gắng đảm bảo có một ViewModel tại chỗ (ngay cả khi nó chỉ hiển thị mô hình) để việc tái cấu trúc trở nên dễ dàng hơn sau này.

+0

Xin chào Adam, xin lỗi vì đã trả lời muộn.Vì vậy, làm thế nào bạn sẽ xử lý tình huống mà bạn cần để hiển thị một bộ sưu tập của khách hàng trên xem hóa đơn, nơi chỉ có một thông tin rất cơ bản là cần thiết (ví dụ Mã, Tên và Id). Bạn có một CustomerBasicInfo trong mô hình của bạn, hoặc ...? – Goran

+0

Thông thường, mô hình được bạn quyết định, bởi tên miền của bạn, bởi dịch vụ web vv. Vì vậy, bạn tạo một mô hình chế độ xem để bao bọc mô hình và hiển thị dữ liệu dễ dàng hơn cho chế độ xem (ví dụ: thêm thuộc tính như đã chọn, hiển thị v.v.). Nếu bạn có chế độ xem chỉ đọc và mô hình của bạn đủ giống với cấu trúc lượt xem thì bạn luôn có thể sử dụng nó ngay bây giờ và thay thế nó sau bằng chế độ xem mô hình khi thông số kỹ thuật của bạn thay đổi. Hãy cẩn thận khi để mối quan tâm giao diện người dùng leo vào mô hình của bạn –

1

Câu hỏi của tôi là, tại sao các mô hình của bạn triển khai INPC? Họ có cần phải không?

Thông thường, các mô hình chỉ là DTO và không cần bất kỳ logic thay đổi nào. Ngoài ra nếu việc triển khai INPC cơ sở của bạn đến từ một khung MVVM, nhưng các mô hình của bạn tồn tại trong một assembly chung thì assembly đó có cần tham chiếu tới khung MVVM của bạn và các assembly WPF khác không? Không.

Kịch bản mà chúng tôi có là một tập hợp các đối tượng được chia sẻ đại diện cho dữ liệu của chúng tôi trên cả máy chủ và phía máy khách. Phía máy khách là một ứng dụng WPF vì vậy điều đó là tốt nhưng đối với phía máy chủ là một dịch vụ, vì vậy chúng tôi không cần INPC.

+0

Xin chào Cameron, xin lỗi vì đã trả lời muộn, tôi đã đi nghỉ mát. Vâng, ai đó phải thực hiện INPC, eithee Customer (Model) hoặc CustomerViewModel. Chúng ta có cần DTO trong mọi tình huống không? Nếu bạn muốn giới thiệu tham chiếu đến khung MVVM từ Mô hình, bạn có thể, nhưng không bắt buộc. Triển khai INPC rất đơn giản. ViewModelBase từ khung MVVM sẽ vẫn được sử dụng làm cơ sở cho VIewModels. Vấn đề của tôi là: nếu tôi hỏi một câu hỏi "tôi có nên sao chép tất cả các thuộc tính mô hình trong VM", và câu trả lời là có, bất kể loại ứng dụng, tôi tự hỏi - tại sao? – Goran

0

Chế độ xem của bạn không chính xác. Nếu bạn đã có Mô hình loại sản phẩm, bạn có thể chỉ cần xác định một cái gì đó như thế này trong ViewModel của bạn: Sản phẩm công cộng sản phẩm {...}

+2

Đó là cốt lõi của câu hỏi của anh ấy! Việc hiển thị Mô hình cho Chế độ xem sẽ bỏ qua trách nhiệm của ViewModel. –

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