2009-03-13 44 views
5

Có rất nhiều ví dụ tuyệt vời xung quanh về MVVM nhưng tôi vẫn còn bối rối.Mô hình liên kết và xem mô hình Silverlight MVVM

Cho phép nói rằng bạn có CustomerModel và CustomerViewModel. Có vẻ như sẽ có một thuộc tính Name trên CustomerModel và một trên CustomerViewModel. Setter trên CustomerViewModel sẽ thiết lập thuộc tính CustomerModel Name và sau đó gọi OnPropertyChanged (PropName) để giao diện người dùng sẽ cập nhật. Điều này có thực sự đúng không? Có vẻ như getter/setters sẽ được định nghĩa hai lần. Nếu bạn có một mô hình với 50 tài sản thì thats sẽ nhận được thực sự tẻ nhạt.

Ngoài ra, hãy nói rằng tôi đặt thuộc tính Qty. ViewModel cập nhật Mô hình. Mô hình cập nhật thuộc tính Giá trị dựa trên số lượng Qty mới. Làm thế nào để ViewModel được thông báo rằng thuộc tính Model đã thay đổi?

Trả lời

2

Trong ví dụ khách hàng mà bạn cung cấp, CustomerModel chứa tất cả thông tin được lưu trữ bởi cơ sở dữ liệu của bạn (hoặc chương trình phụ trợ khác). CustomerViewModel chứa thông tin tương tự nếu nó sẽ được hiển thị trên UI (Tên vv, có khả năng 50 thuộc tính khác nếu bạn có một lớp lớn) nhưng khi sử dụng giao diện INotifyPropertyChanged để hiển thị chúng như các thuộc tính mà View (tức là XAML) có thể ràng buộc.

ví dụ:

public int Name 
{ 
    get 
    { 
     return this.name; 
    } 

    set 
    { 
     if (this.name!= value) 
     { 
      this.name= value; 
      this.OnPropertyChanged("Name"); 
     } 
    } 
} 

ViewModel cũng chứa bit khác của nhà nước UI - cờ Tầm nhìn, Tab chỉ số hiện tại, bit phức tạp hơn của văn bản được tạo ra từ dữ liệu trong nhiều lĩnh vực, ObservableCollection < > các mặt hàng trẻ em, vv Tất cả đang có để bị ràng buộc với XAML.

Tôi đã thấy ViewModel được tạo từ Mô hình dưới dạng quy trình một chiều, một chiều, ví dụ: với một constructor:

CustomerViewModel viewModel = new CustomerViewModel(customer); 

hoặc như là một phương pháp khuyến nông

CustomerViewModel viewModel = customer.ToViewModel(); 

Tôi chưa thấy bất kỳ điều khoản cho việc cập nhật một ViewModel để thay đổi mô hình - điểm của ViewModel là nó được phân lập từ ngươi mâu. Nó giữ một bản sao riêng của dữ liệu. Nó không tuyên truyền các thay đổi về mô hình, không phải cho đến khi bạn nhấn nút "lưu". Vì vậy, nếu bạn hủy thay vào đó, không có gì trong mô hình đã thay đổi và không có gì để hoàn tác.

Bạn có thể đang cố gắng hết sức để giữ cho ViewModel được cập nhật với Mô hình - hầu hết các trường hợp như lưu hoặc tải bạn chỉ có thể vứt bỏ ViewModel hiện tại và tạo một mô hình mới từ trạng thái hiện tại của mô hình. Bạn có cần giữ trạng thái UI của ViewModel và thay đổi dữ liệu trong đó không? Nó không phải là một yêu cầu phổ biến nhưng nó có thể được thực hiện với một phương pháp hoặc hai được gọi là khi lưu hoặc tải xảy ra.

Vì vậy, cũng có giả định rằng logic nối dây này xảy ra ở đâu đó. Đây là lý do tại sao hầu hết các mẫu có liên quan đến số lượt xem cũng liên quan đến bộ điều khiển chịu trách nhiệm về các lệnh (ví dụ: hiển thị khách hàng, lưu khách hàng) và thiết lập trạng thái giao diện người dùng mới sau đó.

+0

Nếu bạn giữ ViewModel tách biệt với Mô hình, làm cách nào để áp dụng bất kỳ quy tắc nào trong Mô hình? Nói rằng tôi có một mô hình với số lượng và giá trị. Nếu tôi thay đổi số lượng trên ViewModel sẽ chảy qua mô hình cập nhật giá trị dựa trên số lượng mới. Bây giờ ViewModel sẽ hiển thị Giá trị mới. –

+0

"Nếu tôi thay đổi số lượng trên ViewModel sẽ chuyển sang mô hình" không, không cho đến khi bạn nhấn nút Lưu hoặc tương tự. Khi bạn làm điều đó, trình xử lý cho điều đó sẽ cập nhật mô hình, duy trì nó và tạo ra một ViewModel mới ngoài trạng thái Model mới. – Anthony

+0

Vì vậy, nếu nó không chảy qua Mô hình, thì ViewModel sẽ nhận được trường Giá trị được cập nhật như thế nào? Nếu tôi thay đổi Số lượng, với tư cách là người dùng tôi mong đợi sẽ thấy Giá trị mới. MV không có logic nghiệp vụ để tính toán Giá trị, chỉ có Mô hình thực hiện. –

5

ViewModel của bạn không phải đóng gói Mô hình đúng cách. Trong kịch bản của bạn, CustomerViewModel có thể có thuộc tính Customer, mà cuối cùng có nghĩa là View của bạn liên kết với các thuộc tính Model ... nó chỉ làm như vậy thông qua ViewModel. Điều đó hoàn toàn hợp pháp. Điều đó nói rằng, tuy nhiên, thường có một lợi ích để đóng gói này. Mô hình kinh doanh của bạn có thể không bao gồm thông báo thay đổi. Bạn có thể không muốn tương tác người dùng sửa đổi mô hình kinh doanh cho đến khi người dùng nhấp vào nút OK.Mô hình kinh doanh của bạn có thể thông qua các ngoại lệ cho đầu vào không hợp lệ, trong khi bạn muốn sử dụng một hình thức xác thực khác. Tôi chắc rằng bạn có thể nghĩ về những thứ khác. Trong thực tế, tôi đoán rằng hầu hết thời gian bạn sẽ muốn đóng gói, vì vậy nó không thực sự "tẻ nhạt" trong ý nghĩa của chỉ cần viết rất nhiều phương pháp tiếp điểm vô nghĩa.

0

Chính xác cách thực hiện việc này, sẽ phụ thuộc một phần vào mô hình kinh doanh của bạn là wekempf đã được nêu rõ.

Tùy thuộc vào cách bạn hiển thị thông tin khách hàng trong giao diện người dùng của mình, bạn có thể có loại ObservableCollection of Customer (mô hình của bạn) trong ViewModel của mình. Ví dụ: nếu bạn đang hiển thị kịch bản chính/chi tiết, nơi bạn có thể có danh sách khách hàng và hiển thị chi tiết bên dưới khi một khách hàng cụ thể được chọn.

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