Chúng ta có nên liên kết chế độ xem với một thuộc tính mô hình hay ViewModel nên có thuộc tính riêng của nó không ..?


21

Tôi đang bắt đầu một dự án với môi trường kỹ thuật sau: .Net 4.0, Entity Framework 4.0, WPF với MVVM Architecture

Tôi đã thấy rất nhiều ví dụ trên mạng, một số cuốn sách với môi trường này. Trong một số ví dụ, các tác giả đã có ý tưởng này:

  1. Viemodel sẽ có một thể hiện của lớp Model (Entity Framework Entity eg Person)
  2. Liên kết các điều khiển khung nhìn WPF với các thuộc tính của Model

Trong khi một số tác giả đã làm:

  1. Viemodel sẽ trưng bày tất cả các thuộc tính của mô hình.
  2. Liên kết các điều khiển khung nhìn WPF với các thuộc tính của ViewModel thay vì trực tiếp với mô hình.

Vì vậy, nó có phải là một ý tưởng tốt để cho các khung nhìn liên kết các thuộc tính từ mô hình chứ không phải là viewmodel phơi bày chính nó? Hoặc cái nào được ưa thích hơn?


Cá nhân tôi thấy việc phơi bày các thuộc tính của mô hình để dẫn đến sự tách biệt tốt giữa lớp dữ liệu và các lớp logic của bạn.
Alex Hope O'Connor

Câu trả lời:


25

Tôi nghĩ rằng rất nhiều lập trình viên trước tiên cố gắng thực hiện các phím tắt liên kết trực tiếp với mô hình, nhưng theo kinh nghiệm của tôi, điều này có một số nhược điểm lớn. Vấn đề chính là nếu mô hình thực thể của bạn được NHibernate hoặc tương tự duy trì, thì ngay khi Chế độ xem cập nhật thuộc tính mô hình, thì NHibernate có thể tiếp tục những thay đổi đó đối với cơ sở dữ liệu. Điều đó không hoạt động tốt đối với các màn hình chỉnh sửa có nút Lưu / Hủy. Trong thực tế, nó có thể chọn chờ và duy trì mọi thứ theo một đợt, nhưng ý tưởng là khi bạn thay đổi mô hình, bạn đang cam kết thay đổi.

Vì vậy, bạn vẫn có thể thoát khỏi ràng buộc trực tiếp với các thuộc tính mô hình trên màn hình chỉ đọc, nhưng sau đó bạn sẽ có sự không nhất quán.

Ngoài ra, hầu hết các kiểu máy không triển khai INotifyPropertyChangedđể chúng có thể không phải là mục tiêu ràng buộc phù hợp nếu trạng thái của màn hình thay đổi sau màn hình ban đầu.

Để dễ dàng cho các thuộc tính tự động, tôi đề nghị luôn ràng buộc Chế độ xem với ViewModel, chứ không phải cho Mô hình. Nó phù hợp, đơn giản và cung cấp cho bạn sự linh hoạt nhất để hỗ trợ các thay đổi trong tương lai.


Tôi thích câu trả lời của bạn. +1 để đề cập đến Chỉnh sửa / Lưu màn hình .. Nhưng sau đó, sẽ rất khó khăn khi viết các thuộc tính hai lần - một lần trong mô hình và một lần nữa trong mô hình xem. Nó cũng sẽ tăng thời gian phát triển. Bạn có nghĩ rằng nó là chính đáng để làm như vậy ...?
Pravin Patil

9
@Pravin Patil - fwiw, mỗi lần tôi sử dụng phím tắt đó, tôi đã tự nguyền rủa mình sau đó khi tôi phải quay lại và sửa nó. Có rất ít nỗ lực để triển khai lại các thuộc tính trên ViewModel, đặc biệt là nếu chúng chỉ đọc (vì bạn có thể sử dụng các thuộc tính được triển khai tự động với một trình thiết lập riêng). Thực tế là, trong hầu hết các trường hợp, Model là một cấu trúc dữ liệu khác với ViewModel. Để bản thân linh hoạt thay đổi Mô hình mà không ảnh hưởng đến Chế độ xem. Bạn càng ít phải thay đổi Chế độ xem thì càng tốt, vì Chế độ xem khó kiểm tra.
Scott Whitlock

4
@Scott Whitlock: Tôi đã phát triển các ứng dụng WPF với NHibernate được hai năm nay và chưa bao giờ có bất kỳ rắc rối nào liên quan trực tiếp đến mô hình. Trong thực tế, khi một thuộc tính mô hình thay đổi, đó hầu như là cùng một nỗ lực cho sự thay đổi, bất kể bạn ràng buộc với điều gì. Và khi tôi thực sự cần phải thực hiện một số định tuyến trong chính ViewModel, thì việc đầu tư thời gian trước khi tôi cần nó là không đáng. Tôi theo phương pháp YAGNI (chưa) và không gặp khó khăn gì. Tôi nghĩ rằng bạn và những người khác ở đây đang hơi giáo điều về vấn đề này.
Falcon

16

Điểm của a ViewModellà nó là một mô hình của View.

Bạn nên ràng buộc ViewModelvới View, không phải bất kỳ Modelthuộc tính nào (không trực tiếp, dù sao).


8

Tôi thấy cả hai phương pháp đều được chấp nhận

Liên kết chỉ với ViewModel là cách tiếp cận "MVVM-purist" và dẫn đến sự phân tách tốt hơn giữa các lớp. Liên kết với Mô hình thường nhanh hơn và thuận tiện hơn.

Trừ khi tôi có lý do chính đáng để tách biệt hoàn toàn các lớp (quy mô dự án, mối quan tâm bảo trì trong tương lai, loại Mô hình tôi đang làm việc, v.v.), tôi liên kết với Mô hình.


7

Tôi nghĩ những gì bạn đang thấy là một khái niệm gọi là liên kết, đó là nếu mô hình của bạn có một thuộc tính được gọi là tên và mô hình xem của bạn hiển thị thuộc tính này mà không cần chỉnh sửa hoặc chuyển đổi bổ sung thì bạn có thể liên kết với mô hình.

Mã giả:

 {Binding: MyViewModel.MyModel.Name}

Điều này được thực hiện để giảm số lượng thuộc tính 'Fluff' trên mô hình chế độ xem, thật không may, đây cũng là một ý tưởng tồi trong dài hạn. Khái niệm về mô hình khung nhìn là để đảm bảo rằng khung nhìn không phụ thuộc vào mô hình. Bằng cách ràng buộc thông qua bạn bây giờ phải đảm bảo rằng mô hình của bạn chứa một thuộc tính được gọi là tên nếu không việc triển khai của bạn sẽ bị phá vỡ.

Tuy nhiên, nếu bạn chỉ liên kết với mô hình chế độ xem, bạn có thể thay đổi mô hình và chế độ xem sẽ không bao giờ biết vì nó sẽ chỉ nhìn thấy thuộc tính có tên là Tên trên mô hình chế độ xem.

Bây giờ điều này có thể được giảm nhẹ trong một số trường hợp nhất định là mô hình của bạn được dựa trên một giao diện. Vì vậy, nếu giao diện có IBaseDetails hiển thị thuộc tính ModuleName thì bạn có thể:

Mã giả:

 {Binding: MyViewModel.MyModel.ModuleName}

Miễn là bất kỳ Mô hình nào bạn thực hiện đều đáp ứng giao diện IBaseDetails, thì bạn hãy lưu ý rằng đây là trường hợp cạnh và nói chung, bạn luôn luôn tốt hơn 90% để bọc mô hình xem của mình xung quanh bất kỳ mô hình nào.


2

Nếu bạn thấy nhiều ma sát đang cố gắng đi từ Model -> ViewModel, hãy thử một cái gì đó như AutoMapper. Nó loại bỏ tedium liên quan đến sao chép thuộc tính bằng tay.


1

Tôi đến đây chỉ vì tôi có cùng nghi ngờ và tôi đã bị thuyết phục rằng tôi sẽ luôn ràng buộc để xem mô hình thay vì mô hình.

Thực hiện theo cách tiếp cận của hình thức phản ứng góc. Bạn tạo một nhóm biểu mẫu bằng cách sử dụng một số thông tin Mô hình Chế độ xem nhưng sau đó bạn phải truy cập biểu mẫu. Các giá trị để nhận các giá trị và sao chép các giá trị cho mô hình bằng cách sử dụng bất kỳ trình ánh xạ tự động hoặc hướng dẫn sử dụng nào Tôi nghĩ rằng không có gì đẹp hơn so với các thuộc tính trong mô hình xem, ví dụ tôi có một trang xem dự án nơi tôi có tên dự án, tên khách hàng, v.v.

Có một mối quan hệ giữa dự án và khách hàng vì dự án có một khách hàng. Vì vậy, ở cấp độ này, tôi không nên quan tâm đến mối quan hệ đó, tôi chỉ cần hiển thị trực quan tên dự án và tên khách hàng trong chế độ xem để tôi đặt 2 thuộc tính trong tên dự án mô hình xem và tên máy khách để tôi liên kết các điều khiển xem với cả hai chúng, sau này tôi sẽ lo lắng về việc đưa ra các giá trị cho các thuộc tính đó trong mã phía sau lấy từ bất kỳ cấu trúc nào mà mô hình có.

Điều tương tự có thể là để cập nhật mô hình trong trường hợp lưu / hủy không có gì sạch hơn.


bài này khá khó đọc (tường văn bản). Bạn có phiền chỉnh sửa ing nó thành một hình dạng tốt hơn?
gnat

Có bạn đi, chúc mừng.
Ivan Carmenates García
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.