Di MVVM, haruskah ViewModel atau View bertanggung jawab untuk membuat tampilan baru?


11

Dalam aplikasi WPF saya, saya ingin membuat tampilan baru. Di mana saya harus melakukan itu - di ViewModel atau Model ?

Aplikasi ini adalah alat seperti jendela satu bentuk (sangat sederhana untuk sekarang) dengan satu tombol "kirim". Jika salah satu kotak centang dipilih, jendela baru menggunakan ViewModel yang sama akan muncul untuk menanyakan kepada pengguna beberapa detail tambahan. Untuk keperluan pertanyaan ini, mari kita pertimbangkan pendekatan jendela baru tanpa mempertimbangkan pendekatan lain seperti panel yang ditampilkan / disembunyikan.

Idealnya, dalam Tampilan tidak boleh ada kode apa pun. Selain itu, karena View tidak memiliki logika di dalamnya, VM pada awalnya perlu memeriksa apakah membuat tampilan baru diperlukan, dan - ketika itu - memantulkan tanggung jawab ini kembali ke View, yang mengarah ke kode mengasapi.

Di sisi lain, membuat tampilan baru di ViewModel melanggar prinsip bahwa ViewModel tidak boleh tahu apa-apa tentang View.

Jadi, apakah lebih baik membuat view baru di View atau ViewModel?


1
Saya tidak begitu mengerti pertanyaan Anda. Apa yang dimaksud dengan "Dalam Tampilan atau ViewModel"? ViewModels tidak membuat view, dan view tentu saja tidak membuat sendiri.
Robert Harvey

1
Maksud saya lapisan mana yang harus bertanggung jawab untuk menciptakan pandangan baru - sinyal untuk melakukan itu harus datang dari suatu tempat ketika tindakan terjadi. Saya mengecualikan model dari pertanyaan ini sepenuhnya, karena seharusnya tidak tahu apa-apa tentang frontend sama sekali.
Mac70

Mungkin saya tidak mengerti pertanyaan Anda dengan benar, keduanya seharusnya tidak mengganggu pandangan Anda. Jika Anda ingin membuat tampilan baru di viewModel Anda, apakah ada alasan mengapa Anda tidak menggunakan bingkai di xaml untuk mengubah konten Window dengan mengikat ke viewModel Anda saat ini?
Siobhan

Jawaban:


8

Saya menggunakan injeksi ketergantungan dan IViewFactorydisuntikkan ke model tampilan untuk menghormati kedua kendala.

A ProductViewModel(misalnya) panggilan this.viewFactory.Show("Details", this)untuk membuka ProductDetailsViewdengan sendirinya sebagai ProductViewModel. Itu juga bisa membuka tampilan berdasarkan model tampilan lain dengan this.viewFactory.Show<ClientViewModel>().

Implementasinya (sebenarnya ada beberapa untuk WinForms, Windows Wpf sederhana, shell Wpf dengan tab, ...) didasarkan pada StructureMapkonvensi. Tampilan menunjuk model tampilan mereka melalui IView<ProductViewModel>antarmuka.

Jadi model tampilan tidak tahu apa-apa tentang tampilan kecuali perannya (tampilan default, tampilan detail, ...), dan tampilan tidak mengandung kode untuk membuat tampilan lain. Juga, model tampilan berada dalam rakitan terpisah yang tidak mereferensikan rakitan Wpf apa pun.


7

Jawaban teoretis

Jika Anda memiliki ViewModel, tindakan yang memiliki efek kosmetik (misalnya menyorot item pada mouseover) adalah tugas View, sedangkan tindakan yang memiliki efek "nyata" (misalnya menelurkan jendela baru) adalah tugas dari ViewModel.

Karena itu, membuat jendela baru adalah pekerjaan untuk ViewModel. Namun, baik View maupun ViewModelseharusnya tidak tahu bagaimana tepatnya membuat Window, itu bukan bagian dari tanggung jawab mereka dan milik kelas yang berbeda.

Anda dapat berargumen bahwa membuat jendela baru adalah pekerjaan untuk Windows View. Meskipun saya akan tidak setuju, ada sedikit nilai dalam perdebatan seperti itu, karena dalam praktiknya ini bukan akhir dari dunia jika Anda menempatkan kode itu di View, dan juga tidak banyak pekerjaan untuk memindahkannya ke ViewModeltitik selanjutnya . Bagian yang penting adalah bahwa logika untuk pembuatan jendela baru terkandung dalam kelas independen, biasanya semacam WindowFactory. Inti dari MVVM, MVP, MVC, dll adalah bahwa Anda memiliki kelas dengan sedikit tanggung jawab yang jelas. Itu sebabnya Anda tidak menambahkan tanggung jawab tambahan untuk View, ViewModelatau Modeljika Anda tidak perlu.

Dalam keadaan apa pun penciptaan Jendela bukan milik Model, karena Modelbahkan tidak menyadari bahwa ada sesuatu seperti GUI.

Jawaban praktis

Ini adalah tentang "alat seperti-bentuk satu-jendela dengan tombol" kirim "tunggal . Jadi, inilah plug yang tidak tahu malu untuk jawaban terkait saya: Mengapa menggunakan MVVM?

Untuk meringkas apa yang dikatakan jawaban itu: Tetap sederhana. Oh, dan ingatlah jawaban teoretis di atas untuk diterapkan setelah jendela tombol tunggal Anda mulai menjadi lebih kompleks.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.