Saya perlu bantuan membuat model tampilan untuk skenario berikut:
- Data yang mendalam dan hierarkis
- Banyak tampilan untuk kumpulan data yang sama
- Setiap tampilan adalah tampilan tunggal, yang berubah secara dinamis, berdasarkan pilihan aktif
- Bergantung pada nilai properti, tampilkan berbagai jenis tab dalam kontrol tab
Pertanyaan saya:
Haruskah saya membuat representasi model tampilan untuk setiap tampilan (VM1, VM2, dll)?
1. Yes:
a. Should I model the entire hierarchical relationship? (ie, SubVM1, HouseVM1, RoomVM1)
b. How do I keep all hierarchies in sync? (e.g, adding/removing nodes)
2. No:
a. Do I use a huge, single view model that caters for all views?
Berikut adalah contoh tampilan tunggal
Gambar 1: Beberapa tampilan diperbarui berdasarkan ruang aktif. Perhatikan kontrol Tab
Gambar 2: Kamar aktif berbeda. Beberapa tampilan diperbarui. Item kontrol tab berubah berdasarkan properti objek.
Gambar 3: Jenis seleksi yang berbeda. Seluruh tampilan berubah
Jawaban:
Untuk menjawab pertanyaan, Ya, setiap tampilan harus memiliki Model Tampilan sendiri. Tetapi tidak perlu memodelkan seluruh hierarki. Hanya apa yang dibutuhkan tampilan.
Masalah yang saya miliki dengan sebagian besar sumber daya online tentang MVVM:
Dalam sebagian besar contoh, tampilan hampir 1-ke-1 pemetaan Model. Tetapi dalam skenario saya, di mana ada pandangan berbeda untuk berbagai sisi dari Model yang sama, saya menemukan diri saya terjebak di antara dua pilihan:
Satu model tampilan monolitik yang digunakan oleh semua model tampilan lainnya
Atau satu model tampilan untuk setiap tampilan
Namun keduanya tidak ideal.
Model-oriented View Model (MVM), meskipun duplikasi kode rendah, adalah mimpi buruk untuk dipertahankan
View-oriented View Model (VVM) menghasilkan kelas yang sangat terspesialisasi untuk setiap tampilan, tetapi berisi duplikat.
Pada akhirnya, saya memutuskan bahwa memiliki satu VM per Tampilan lebih mudah untuk dipelihara dan dikodekan, jadi saya menggunakan pendekatan VVM.
Setelah kode bekerja, saya mulai refactoring semua properti dan operasi umum ke dalam bentuk terakhirnya saat ini:
Dalam bentuk akhir ini, kelas model tampilan umum dikomposisikan ke dalam setiap VVM.
Tentu saja, saya masih harus memutuskan apa yang dianggap umum / terspesialisasi. Dan ketika tampilan ditambahkan / digabung / dihapus, saldo ini berubah.
Tapi yang menyenangkan tentang ini adalah, saya sekarang dapat mendorong anggota naik / turun dari yang umum ke VVM dan sebaliknya dengan mudah.
Dan catatan singkat tentang menjaga objek tetap sinkron:
Memiliki Model Pandangan Umum menangani sebagian besar dari ini. Setiap VVM dapat dengan mudah memiliki referensi ke Model Common View yang sama.
Saya juga cenderung memulai dengan metode panggilan balik sederhana, dan berkembang menjadi acara / pengamat jika kebutuhan akan banyak pendengar muncul.
Dan untuk acara yang sangat kompleks (yaitu, pembaruan cascading yang tidak terduga), saya akan beralih menggunakan Mediator.
Saya tidak menghindar dari kode di mana seorang anak memiliki referensi kembali ke orang tuanya. Apa pun agar kode berfungsi.
Dan jika kesempatan untuk refactor muncul, saya akan mengambilnya.
Pelajaran yang saya pelajari:
sumber
Melihat mockup Anda, saya pasti akan merekomendasikan membuat hierarki ViewModels dan banyak Tampilan kecil. Dan Anda kemungkinan besar harus memodelkan sedikit hirarki asli.
Untuk menyelaraskan berbagai hal di antara ViewModels, gunakan salah satu acara, atau miliki properti satu sama lain di antara ViewModels. Sinkronisasi antara Tampilan dan ViewModels harus menjadi properti pemberitahuan standar.
sumber