2010-09-29 62 views
8

Tôi chưa bao giờ sử dụng MVVM trước đây, vì vậy tôi có thể thiếu một cái gì đó hiển nhiên. Khi tôi tạo một ứng dụng Panorama mới, đã có một thư mục ViewModel chứa ItemViewModel và MainViewModel.MVVM - Sự khác biệt giữa Model và ViewModel

Tôi nghĩ "MainViewModel.cs" là tệp sắp xếp ảnh toàn cảnh. Tuy nhiên, trong MainViewModel, dòng này có dòng này:

public MainViewModel() 
    { 
     this.Items = new ObservableCollection<ItemViewModel>(); 
    } 

ItemViewModel không tương tác với ảnh toàn cảnh. Đây là những sau đó instantiated như thế này:

this.Items.Add(new ItemViewModel() 
    { LineOne = "first line", LineTwo = "second line", LineThree = "third line" }); 

Tại sao ItemViewModel chỉ là một 'mô hình'? Nó thực hiện INotifyPropertyChanged, nhưng cho mục đích gì? Tôi xin đã nghĩ rằng ObservableCollection trong MainViewModel sẽ là đủ để thông báo cho bất kỳ thay đổi, như demonstrated here

nhờ

Trả lời

5

Các ObservableCollection sẽ thông báo khi các mặt hàng được thêm vào hoặc xóa khỏi danh sách, nhưng INotifyPropertyChanged trên ItemViewModel là cần thiết nếu bạn muốn thông báo xảy ra khi các thuộc tính đó thay đổi.

+0

Vì vậy, ví dụ: nếu khía cạnh thay đổi thuộc tính không liên quan đến ItemViewModel, sẽ có ý nghĩa khi 'xuống hạng' để chỉ đơn giản là 'Mô hình'? – Brap

+1

Tôi không nghĩ bạn đạt được nhiều thứ bằng cách làm điều đó. Để nó như một ViewModel, và chỉ gọi trình xử lý sự kiện cho những mục mà bạn cần. Bằng cách đó, bạn được chuẩn bị cho sự kiện mà bạn sẽ cần phải thực hiện thông báo. – Robaticus

11

Sự khác biệt khá đơn giản.

Mô hình giữ logic nghiệp vụ.
Xem mô hình chứa logic trình bày và được định dạng bổ sung để phù hợp với chế độ xem.

Trong trường hợp của bạn - xem mô hình triển khai INotifyPropertyChanged. Đó là logic trình bày thuần túy.

mẫu không chịu trách nhiệm thông báo cho một giao diện người dùng cụ thể mà một cái gì đó đã thay đổi, đó là trách nhiệm chuyển hóa đơn, tính lương, vv

Đôi khi (khi mô hình là đơn giản) trừu tượng này là không cần thiết mặc dù.


Một số wiki dấu ngoặc kép:

Mẫu: như trong mô hình MVC cổ điển, mô hình đề cập đến một trong hai
(a) một mô hình đối tượng đại diện cho nội dung thực trạng (một hướng đối tượng cách tiếp cận) hoặc
(b) lớp truy cập dữ liệu đại diện cho nội dung đó (phương pháp tập trung vào dữ liệu).

ViewModel: ViewModel là một “Người mẫu của Chế độ xem” có nghĩa là nó là một sự trừu tượng của Xem mà còn phục vụ trong dữ liệu ràng buộc giữa View và Model. Nó có thể được xem như là một khía cạnh chuyên biệt của điều gì sẽ là một Controller (trong mẫu MVC) hoạt động như một trình kết nối/chuyển đổi dữ liệu, thay đổi thông tin Model thành thông tin View và truyền các lệnh từ View vào Model. ViewModel hiển thị các thuộc tính, lệnh và trừu tượng công khai. ViewModel đã được giống như trạng thái khái niệm của dữ liệu trái ngược với trạng thái thực của dữ liệu trong Mẫu.

10

Đó là khái niệm chung giống nhau đằng sau tất cả MV [x] kiến ​​trúc, mặc dù MVC, MVP hoặc MVVM:

  • Bạn có mô hình trên một bên, mà về cơ bản là một trừu tượng phần mềm của lĩnh vực kinh doanh của bạn. Nó không biết và không quan tâm đến bất kỳ nội dung nào liên quan đến giao diện người dùng (ví dụ: trong trường hợp của bạn 'thông báo cho UI về các thay đổi'). Nó thực hiện logic kinh doanh và đó là nó. Mặt khác, bạn có giao diện người dùng, với nhu cầu cụ thể cả về mặt kỹ thuật (ví dụ: 'WPF muốn liên kết với một số ObservableCollection') và cả về cách trình bày của người dùng (ví dụ như về các thứ tự ngày khác nhau hoặc các dấu thập phân khác nhau trong ngôn ngữ khác nhau).
  • Để đối phó với điều này và để có thể tách biệt rõ ràng các yêu cầu này trong một kiến ​​trúc sạch, bạn cần [x], trong trường hợp của bạn là ViewModel. Đó là lớp duy nhất trong phần mềm biết cả về UI và Model. Nếu không, sẽ không có kết nối nào giữa hai người.

Trong ví dụ đơn giản, điều này có vẻ quá mức cần thiết, nhưng một phần mềm kinh doanh thông thường sẽ có hàng chục hoặc thậm chí hàng trăm MV [x] ba lần, và bạn sẽ không có cách nào để duy trì kiến ​​trúc sạch.

Để trả lời câu hỏi của bạn: Những gì bạn có trong ví dụ của mình chỉ là một chút mã dây để thiết lập kiến ​​trúc được mô tả.

HTH! Thomas

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