Apakah praktik yang baik untuk menggunakan kontrol pengguna untuk menyusun formulir WPF bahkan jika kontrol pengguna ini hanya digunakan sekali?

8

Saya mengembangkan aplikasi WPF menggunakan MVVM dan saya belajar bagaimana melakukan hal-hal terbaik.

Saya memiliki formulir WPF dengan pemilih, dua daftar dengan bidang pencarian, dan beberapa elemen lainnya. Saat ini semua dalam satu bentuk dan berfungsi. Tetapi sekarang VM untuk formulir itu memiliki lebih dari 800 baris dan belum selesai.

Saya ingin menyusun formulir dan kode ini dengan lebih baik. Saya memikirkan daerah, file dengan kelas parsial dan kontrol pengguna. Saya pikir kontrol pengguna akan menjadi yang terbaik karena mereka merangkum beberapa kontrol dan logika. Jika saya akan menggunakan kontrol pengguna maka jumlah kode di jendela itu dan VM akan berkurang secara drastis.

Untuk melakukan ini dengan benar saya bekerja melalui buku "Pro WPF 4.5 In C # 4th Edition", Bab 18 - Elemen Kustom dan sampel ColorPickerUserControl. Sampel adalah tentang color picker dengan tiga slider dan memiliki 150 baris kode.

Saya rasa saya mengerti cara kerjanya tetapi menurut saya membuat kontrol pengguna, bahkan dengan fungsionalitas yang sangat terbatas seperti dalam sampel, adalah banyak pekerjaan . Jika saya akan menggunakan kontrol ini beberapa kali maka saya mengerti akan masuk akal untuk melakukan ini. Tetapi jika saya menggunakan kontrol hanya satu kali dan saya melakukan ini hanya untuk struktur formulir saya maka ini tampaknya banyak pekerjaan untuk mendapatkan sedikit keuntungan.

Pertanyaan saya adalah: Apakah praktik yang baik untuk menggunakan kontrol pengguna untuk struktur bentuk bahkan jika kontrol pengguna ini hanya digunakan sekali? Jika tidak, apakah ada alternatif yang lebih baik?

Sunting (tidak perlu membaca, hanya informasi lebih lanjut): Sampai sekarang saya tidak menulis rincian karena saya ingin belajar tentang prinsip tetapi setelah membaca 17 dari 26 jawaban yang menarik, berikut adalah beberapa perincian: Formulir ini untuk memilih judul musik.

  • Grup A: (mungkin kontrol pengguna A) adalah tentang jenis pilihan seperti pilih berdasarkan artis atau album, dengan atau tanpa video, mungkin tahun publikasi, dll.

  • Grup B: Daftar ini berisi nama artis yang difilter menurut kriteria di A. Pengguna dapat memfilter daftar yaitu hanya menampilkan nama artis yang mengandung "atas".

  • Grup C: Daftar ini menunjukkan judul dari artis yang dipilih dalam B juga menggunakan kriteria dari A (yaitu audio atau video). Itu dapat disaring mirip dengan B yaitu hanya judul yang mengandung "Anda".

Sebagian besar logika terjadi di VM (DataContext dari formulir). Daftar dari A dan B berasal dari database. Daftar disaring dan disiapkan untuk presentasi (yaitu beberapa judul dengan nama yang sama tetapi dalam album yang berbeda). Pengguna memilih judul dalam Daftar-C dengan mengklik dua kali atau menggunakan seret dan lepas ke formulir WPF lainnya.

Yang saya inginkan: Saya ingin kode yang dapat dibaca sehingga saya dapat dengan mudah mengubahnya. Jika saya ingin menambahkan yaitu filter lain, katakan saja hanya menampilkan artis wanita maka akan lebih baik jika saya bisa pergi ke kontrol pengguna A dan menambahkan kotak centang untuk seniman pria dan / atau wanita.

XAML dalam bentuk saat ini tidak masalah, terstruktur dengan baik. Tetapi VM memiliki kode untuk semua hal di atas. Beberapa hal ada di konstruktor, beberapa di bagian perintah, beberapa properti dan bidang dukungan. Saya masih dapat menemukan hal-hal sekarang tetapi saya pikir akan lebih baik jika kode akan lebih terstruktur. Inilah mengapa saya berpikir tentang Kontrol Pengguna.

Saya mencoba mengikuti MVVM karena saya pikir logika di baliknya masuk akal. Tetapi saya bukan pengikut fanatik praktik teoretis apa pun. Yaitu jika saya bisa melakukan sesuatu dalam 5 baris CodeBehind atau dalam 50 baris di VM saya akan melakukannya di CodeBehind. Pertanyaan saya adalah tentang prinsip bagaimana membuat formulir terstruktur di WPF. Bentuk yang saya jelaskan di atas adalah contoh yang baik tetapi jawabannya tidak boleh berkonsentrasi pada yang satu ini dari tetapi pada gagasan bagaimana struktur formulir WPF yaitu dengan (atau tanpa) kontrol pengguna.

Tentang mengapa saya pikir kontrol pengguna banyak pekerjaan: Mereka memiliki properti ketergantungan, acara yang dirutekan, dll. Semua ini bagi saya jauh lebih rumit daripada properti "normal" dengan bidang dukungan dan INotify. Tapi mungkin saya hanya harus terbiasa dengan properti ketergantungan, acara yang dirutekan, dll.

Edgar
sumber
Saya agak bingung mengapa Anda berpikir membuat kontrol pengguna adalah banyak pekerjaan. Dalam bentuknya yang paling sederhana, UserControl hanyalah sebuah wadah. Anda membuat satu seperti ini: <UserControl> </UserControl>. Itu dia.
Robert Harvey
Mengenai pengeditan Anda: Kontrol Pengguna hanya memiliki properti ketergantungan, acara yang dirutekan, dll., Jika Anda memutuskan untuk memasukkan hal-hal itu. Mereka tidak wajib, dengan cara apa pun.
Robert Harvey
@RobertHarvey: Ya, saya mengerti itu. Tetapi tampaknya untuk "fungsionalitas penuh" dengan ikatan dua arah, memicu sesuatu dalam bentuk utama jika sesuatu dalam kontrol pengguna diubah, dll. Mereka diperlukan. Saya pikir sampel dalam buku yang saya sebutkan di atas menunjukkan betapa pentingnya mereka (tidak selalu).
Edgar
Bukankah Anda masih harus melakukan semua itu tanpa menggunakan Kontrol Pengguna?
Robert Harvey
1
Itu juga tidak terdengar seperti ViewModel melakukan banyak hal. Menyortir dan memfilter daftar hasil adalah tugas yang cukup kecil untuk ViewModel. Mungkin masalahnya bukan apa yang dilakukan VM, tetapi bagaimana itu ditulis. Mungkin ada beberapa fitur C # yang dapat Anda gunakan untuk mengurangi ukuran kode. Atau mungkin VM dapat di refactored untuk memperkecil ukurannya.
17 dari 26

Jawaban:

7

Pastinya ya. Ini adalah ide yang baik dengan cara yang sama bahwa itu adalah ide yang baik untuk menerapkan pemisahan masalah pada kelas untuk menempatkan masing-masing dalam dirinya sendiri untuk melakukan satu tugas. Anda mungkin hanya memiliki satu instance dari kelas itu, tetapi itu tidak penting. Optimalisasi bukan dalam hal kinerja program tetapi dalam hal organisasi dan keseluruhan program "kesehatan".

Anda ingin dapat kembali ke program Anda satu hari dan tidak perlu menelusuri beberapa ratus halaman kode, bahkan jika itu dimasukkan ke dalam wilayah (menggunakan daerah pada kelas dengan banyak kode seperti meletakkan lipstik pada babi, oleh cara). Jika suatu hari Anda memutuskan untuk menggunakannya di tempat lain, Anda dapat melakukannya dengan anggun dan tanpa banyak masalah.

Hanya saja, jangan membuat godaan untuk memberikan akses kontrol pengguna ke formulir induk. Jika Anda melakukannya dengan cara ini, gunakan acara untuk menyampaikan informasi kepada orang tua, dengan formulir orang tua sebagai pelanggan.

Neil
sumber
Selain itu, ketika Anda membuat kontrol kustom, Anda dapat merangkum bagian dari logika presentasi yang bertanggung jawab, yang, jika dilakukan dengan benar, pada gilirannya akan membuat logika presentasi Anda di kontrol yang berisi lebih mudah.
Filip Milovanović
"Benar-benar ya" adalah IMHO bukan jawaban yang baik ketika upaya untuk membuat kontrol pengguna setinggi yang dijelaskan OP.
Doc Brown
1
VIewModel memiliki satu kepedulian untuk mengoordinasikan logika antarmuka pengguna untuk satu set kontrol antarmuka pengguna. Memecah ini bisa menjadi tantangan dan seringkali tidak masuk akal.
17 dari 26
2
@DocBrown Pertanyaannya meminta pendapat tentang praktik secara umum. Jadi saya pikir jawaban Neil adalah opini yang adil dan jujur. Tidak ada jawaban mutlak untuk apa pun, tetapi kami selalu dapat merekomendasikan tempat untuk memulai. IMHO jika saya dibayar untuk kode itu saya akan melakukannya dengan cara yang benar (rekomendasi Neil). Juga - itu bisa sangat membantu untuk melakukan ini jika Anda ingin menggunakan kembali kontrol pada proyek masa depan. Tetapi jika saya hanya ingin bermain-main atau membuat sendiri sesuatu, saya hanya akan melakukannya dengan lebih cepat karena saya sudah ketinggalan di binatu.
Christopher
1
"benar-benar ya" tidak benar. Jawaban yang tepat adalah "Itu tergantung". Ini menambah biaya dan kompleksitas untuk membagi View / VM menjadi beberapa Views / VMs. Manfaatnya harus melebihi biaya.
17 dari 26
4

Ini adalah pertanyaan yang sangat sulit dijawab tanpa melihat kode yang sebenarnya. Anda juga sedikit mencampur istilah. Kontrol pengguna bukan pemetaan 1: 1 dengan ViewModels.

Kontrol pengguna memiliki tujuan khusus dalam kehidupan: Kontrol ini adalah komposisi beberapa elemen UI yang digunakan sebagai satu kesatuan. Kontrol pengguna adalah subbagian dari Tampilan. Ini sangat berbeda dari ViewModel, yang berisi logika yang terikat dengan Tampilan.

Mungkin masuk akal untuk memecah XAML Anda menjadi beberapa kontrol pengguna semua didorong oleh ViewModel tunggal. Mungkin masuk akal untuk memecah kode XAML dan C # Anda menjadi beberapa pasang View-VM. Mungkin masuk akal untuk membiarkannya seperti yang Anda miliki sekarang. Mustahil untuk mengatakan tanpa melihat kode yang dimaksud.

Apa tujuan akhir Anda di sini? Apakah ukuran kode menyebabkan Anda benar-benar kesakitan atau hanya karena mengikuti praktik teoretis?

Apakah Anda mencoba mengurangi ukuran Tampilan XAML Anda atau ukuran C # ViewModels Anda? Ini adalah dua tugas yang sangat berbeda di dunia WPF MVVM.

800 baris tidak terlalu besar untuk VM yang mendukung UI yang memiliki kompleksitas. Memecah VM sering dapat menyebabkan lebih banyak masalah daripada memecahkannya. ViewModels membuat keputusan seperti "nonaktifkan fitur ini ketika daftar lain ini kosong". Mencoba untuk membagi pengambilan keputusan semacam itu di beberapa komponen sering kali tidak masuk akal dan hanya akan menambah kompleksitas kode.

Sekarang dengan mengatakan, mungkin ada pekerjaan yang Anda lakukan di VM yang tidak ada hubungannya dengan logika ViewModel Anda dan dapat dengan mudah dipartisi ke dalam kelasnya sendiri. Ini akan mengurangi ukuran ViewModel tanpa meningkatkan kompleksitas keseluruhan kode.

Saya kira itu hanya cara yang sangat panjang untuk mengatakan "Itu tergantung, dan kami tidak bisa mengatakannya tanpa melihat kode yang dimaksud".

17 dari 26
sumber
Terima kasih atas jawaban anda. Saya tidak pernah membaca tentang memiliki beberapa pasang View-VM - itu terdengar seperti ide yang menarik. Untuk sisanya saya menambahkannya ke pertanyaan saya.
Edgar
Apa yang Lihat dalam beberapa pasangan View-VM ini(a UserControl/a Grid/a Page ??)
Nama Kode Jack
0

Jika saya, yang tidak tahu apa-apa tentang aplikasi Anda, harus menambahkan bidang baru di atas bidang nama keluarga, atau mengubah urutan beberapa bidang ... Saya akan merasa mudah atau menakutkan?

Saya tidak percaya pada daerah karena kompiler tidak akan memeriksa apakah Anda salah menempatkan sesuatu di wilayah yang salah

Anda harus mengembangkan perangkat lunak dengan tujuan memudahkan orang untuk membangun apa yang Anda buat.

Dev Bravo
sumber
Apakah Anda pernah membuat formulir di WPF? Jika ya, maka Anda harus tahu bahwa Anda akan melakukan apa yang Anda jelaskan di bagian XAML dari formulir dan bukan di kode di belakang atau VM. Atau untuk menjawab pertanyaan Anda: Ya, itu akan sangat mudah.
Edgar
@ Edgar salahku. Anda berbicara tentang komponen visual dan kontrol pengguna dan saya pikir itu saja. Jika semua visual Anda dalam pandangan, dan semua logika bisnis Anda dalam model, Anda tidak perlu khawatir memiliki VM yang panjang.
A Bravo Dev