Tôi đang xem qua một số bài viết về MVVM, chủ yếu là bài này và bài này .
Câu hỏi cụ thể của tôi là: Làm cách nào để truyền đạt các thay đổi của Mô hình từ Mô hình sang Mô hình xem?
Trong bài viết của Josh, tôi không thấy rằng anh ấy làm điều này. ViewModel luôn hỏi Model về các thuộc tính. Trong ví dụ của Rachel, cô ấy có triển khai mô hình INotifyPropertyChanged
và nêu ra các sự kiện từ mô hình, nhưng chúng được sử dụng cho chính chế độ xem (xem bài viết / mã của cô ấy để biết thêm chi tiết về lý do tại sao cô ấy làm điều này).
Không nơi nào tôi thấy các ví dụ mà mô hình cảnh báo ViewModel về những thay đổi đối với thuộc tính mô hình. Điều này làm tôi lo lắng rằng có lẽ nó không được thực hiện vì một số lý do. Có mẫu nào để cảnh báo ViewModel về những thay đổi trong Model không? Có vẻ như cần thiết vì (1) có thể hiểu rằng có nhiều hơn 1 ViewModel cho mỗi mô hình và (2) ngay cả khi chỉ có một ViewModel, một số hành động trên mô hình có thể dẫn đến các thuộc tính khác bị thay đổi.
Tôi nghi ngờ rằng có thể có câu trả lời / nhận xét ở dạng "Tại sao bạn muốn làm điều đó?" nhận xét, vì vậy đây là mô tả về chương trình của tôi. Tôi mới sử dụng MVVM nên có lẽ toàn bộ thiết kế của tôi bị lỗi. Tôi sẽ mô tả ngắn gọn về nó.
Tôi đang lập trình thứ gì đó thú vị hơn (ít nhất là với tôi!) Hơn là các lớp "Khách hàng" hoặc "Sản phẩm". Tôi đang lập trình BlackJack.
Tôi có một Chế độ xem không có bất kỳ mã nào phía sau và chỉ dựa vào liên kết với các thuộc tính và lệnh trong ViewModel (xem bài viết của Josh Smith).
Dù tốt hay xấu, tôi mất thái độ rằng Model nên chứa không chỉ các lớp học như PlayingCard
, Deck
, mà còn là BlackJackGame
đẳng cấp mà giữ trạng thái của toàn bộ trò chơi, và biết khi nào người chơi có bức tượng bán thân đi, các đại lý có trách nhiệm xây thẻ, và điểm số hiện tại của người chơi và nhà cái là bao nhiêu (nhỏ hơn 21, 21, phá sản, v.v.).
Từ việc BlackJackGame
tôi tiết lộ các phương thức như "DrawCard" và tôi nhận ra rằng khi một thẻ được rút ra, các thuộc tính như CardScore
, và IsBust
phải được cập nhật và các giá trị mới này được giao tiếp với ViewModel. Có lẽ đó là suy nghĩ sai lầm?
Một người có thể có thái độ mà ViewModel gọi là DrawCard()
phương pháp để anh ta nên biết để yêu cầu điểm số được cập nhật và tìm hiểu xem anh ta có bị phá sản hay không. Ý kiến?
Trong ViewModel của tôi, tôi có logic để lấy hình ảnh thực tế của một thẻ chơi (dựa trên bộ đồ, thứ hạng) và cung cấp nó cho chế độ xem. Mô hình không nên quan tâm đến điều này (có lẽ ViewModel khác sẽ chỉ sử dụng số thay vì chơi hình ảnh thẻ). Tất nhiên, có lẽ một số người sẽ nói với tôi rằng Model thậm chí không nên có khái niệm về trò chơi BlackJack và điều đó nên được xử lý trong ViewModel?
OnBust
và máy ảo có thể đăng ký sự kiện đó. Tôi đoán bạn cũng có thể sử dụng phương pháp IEA.