Saya akan membaca beberapa artikel MVVM, terutama ini dan ini .
Pertanyaan khusus saya adalah: Bagaimana cara mengkomunikasikan perubahan Model dari Model ke ViewModel?
Dalam artikel Josh, saya tidak melihat dia melakukan ini. ViewModel selalu meminta properti dari Model. Dalam contoh Rachel, dia memang memiliki model yang diimplementasikan INotifyPropertyChanged
, dan memunculkan kejadian dari model, tetapi kejadian tersebut untuk dikonsumsi oleh tampilan itu sendiri (lihat artikel / kode miliknya untuk detail lebih lanjut tentang mengapa dia melakukan ini).
Saya tidak melihat contoh di mana model memberi tahu ViewModel tentang perubahan pada properti model. Ini membuat saya khawatir bahwa mungkin itu tidak dilakukan karena suatu alasan. Apakah ada pola untuk memberi tahu ViewModel tentang perubahan dalam Model? Tampaknya diperlukan karena (1) mungkin ada lebih dari 1 ViewModel untuk setiap model, dan (2) meskipun hanya ada satu ViewModel, beberapa tindakan pada model dapat mengakibatkan properti lain diubah.
Saya menduga bahwa mungkin ada jawaban / komentar dalam bentuk "Mengapa Anda ingin melakukan itu?" komentar, jadi inilah deskripsi program saya. Saya baru mengenal MVVM jadi mungkin seluruh desain saya rusak. Saya akan menjelaskannya secara singkat.
Saya memprogram sesuatu yang lebih menarik (setidaknya, bagi saya!) Daripada kelas "Pelanggan" atau "Produk". Saya memprogram BlackJack.
Saya memiliki Tampilan yang tidak memiliki kode apa pun di belakang dan hanya mengandalkan pengikatan ke properti dan perintah di ViewModel (lihat artikel Josh Smith).
Untuk lebih baik atau lebih buruk, saya mengambil sikap bahwa Model harus berisi tidak hanya kelas seperti PlayingCard
, Deck
, tetapi juga BlackJackGame
kelas yang membuat keadaan seluruh permainan, dan tahu kapan pemain memiliki payudara hilang, dealer harus menarik kartu, dan apa skor pemain dan dealer saat ini (kurang dari 21, 21, bust, dll.).
Dari BlackJackGame
saya mengekspos metode seperti "DrawCard" dan terpikir oleh saya bahwa ketika kartu ditarik, properti seperti CardScore
, dan IsBust
harus diperbarui dan nilai-nilai baru ini dikomunikasikan ke ViewModel. Mungkin itu pemikiran yang salah?
Seseorang dapat mengambil sikap bahwa ViewModel memanggil DrawCard()
metode tersebut sehingga dia harus tahu untuk meminta skor terbaru dan mencari tahu apakah dia gagal atau tidak. Opini?
Dalam ViewModel saya, saya memiliki logika untuk mengambil gambar sebenarnya dari kartu remi (berdasarkan jenis, peringkat) dan membuatnya tersedia untuk tampilan. Model tidak perlu khawatir dengan ini (mungkin ViewModel lain hanya akan menggunakan angka daripada memainkan gambar kartu). Tentu saja, mungkin beberapa orang akan memberi tahu saya bahwa Model seharusnya tidak memiliki konsep permainan BlackJack dan itu harus ditangani dalam ViewModel?
OnBust
, dan VM dapat berlangganan padanya. Saya rasa Anda juga bisa menggunakan pendekatan IEA.