ใน MVVM, ViewModel หรือ View ควรรับผิดชอบในการสร้างมุมมองใหม่หรือไม่?


11

ในแอปพลิเคชัน WPF ของฉันฉันต้องการสร้างมุมมองใหม่ ฉันควรทำเช่นนั้น - ในViewModel or Model ?

แอปพลิเคชั่นนี้เป็นเครื่องมือที่มีลักษณะคล้ายหน้าต่างเดียว (ง่ายมากสำหรับตอนนี้ด้วยปุ่ม "ส่ง" เดียว ในกรณีที่เลือกช่องทำเครื่องหมายหนึ่งหน้าต่างใหม่ที่ใช้ ViewModel เดียวกันควรปรากฏขึ้นเพื่อขอรายละเอียดเพิ่มเติมจากผู้ใช้ สำหรับจุดประสงค์ของคำถามนี้ลองพิจารณาเพียงวิธีเข้าหน้าต่างใหม่โดยไม่พิจารณาวิธีอื่นเช่นแสดง / ซ่อนแผง

ในอุดมคติแล้วในมุมมองไม่ควรมีรหัสใด ๆ นอกจากนี้เนื่องจาก View ไม่ได้มีตรรกะใด ๆ ในนั้น VM จะต้องตรวจสอบก่อนว่าการสร้างมุมมองใหม่นั้นจำเป็นหรือไม่ - และเมื่อมีการสะท้อนความรับผิดชอบนี้กลับไปที่ View ซึ่งนำไปสู่การขยายโค้ด

ในทางกลับกันการสร้างมุมมองใหม่ใน ViewModel ละเมิดหลักการที่ ViewModel ไม่ควรรู้เกี่ยวกับมุมมอง

ดังนั้นจะเป็นการดีกว่าหรือที่จะสร้างมุมมองใหม่ใน View หรือ ViewModel?


1
ฉันไม่เข้าใจคำถามของคุณ "In View หรือ ViewModel" หมายถึงอะไร ViewModels ไม่สร้างมุมมองและมุมมองไม่ได้สร้างเอง
Robert Harvey

1
ฉันหมายความว่าเลเยอร์เหล่านี้ควรรับผิดชอบในการสร้างมุมมองใหม่ - สัญญาณที่ต้องทำนั้นต้องมาจากที่ใดที่หนึ่งเมื่อเกิดการกระทำ ฉันไม่ได้รวมโมเดลจากคำถามนี้อย่างสมบูรณ์เพราะไม่ควรรู้อะไรเกี่ยวกับส่วนหน้าเลย
Mac70

บางทีฉันอาจไม่เข้าใจคำถามของคุณอย่างถูกต้องทั้งสองข้อไม่ควรรบกวนความคิดเห็นของคุณ หากคุณต้องการสร้างมุมมองใหม่ใน viewModel ของคุณมีเหตุผลใดที่คุณไม่ได้ใช้เฟรมใน xaml เพื่อเปลี่ยนเนื้อหาหน้าต่างที่มีผลผูกพันกับ viewModel ปัจจุบันของคุณ?
Siobhan

คำตอบ:


8

ฉันใช้การฉีดแบบพึ่งพาและแบบIViewFactoryฉีดในมุมมองเพื่อเคารพข้อ จำกัด ทั้งสอง

ProductViewModel(ตัวอย่าง) เรียกร้องthis.viewFactory.Show("Details", this)ให้เปิดด้วยตัวเองเป็นProductDetailsView นอกจากนี้ยังสามารถเปิดมุมมองตามรูปแบบมุมมองอื่นที่มีProductViewModelthis.viewFactory.Show<ClientViewModel>()

การนำไปใช้งาน (มีจริง ๆ แล้วหลายอย่างสำหรับ WinForms, Wpf Windows แบบง่าย, เชลล์ Wpf ที่มีแท็บ, ... ) เป็นไปตามStructureMapแบบแผน มุมมองกำหนดโมเดลมุมมองผ่านIView<ProductViewModel>อินเตอร์เฟส

ดังนั้นโมเดลมุมมองจะไม่ทราบอะไรเกี่ยวกับมุมมองยกเว้นบทบาท (มุมมองเริ่มต้นมุมมองรายละเอียด ... ) และมุมมองไม่มีรหัสเพื่อสร้างมุมมองอื่น นอกจากนี้โมเดลมุมมองยังอยู่ในชุดประกอบแยกต่างหากซึ่งไม่ได้อ้างอิงชุดประกอบ Wpf ใด ๆ


7

คำตอบเชิงทฤษฎี

หากคุณมีViewModelการกระทำที่มีผลกระทบเครื่องสำอาง (เช่นเน้นรายการเมื่อวางเมาส์) เป็นงานของViewในขณะที่การกระทำที่มีผลกระทบ "ของจริง" (เช่นการวางไข่หน้าต่างใหม่) ViewModelเป็นงานของ

ViewModelเช่นการสร้างหน้าต่างใหม่เป็นงานสำหรับการ อย่างไรก็ตามทั้งมุมมองและไม่ViewModelควรรู้ว่าจะสร้างหน้าต่างได้อย่างไรนั่นไม่ใช่ส่วนหนึ่งของความรับผิดชอบและเป็นของคลาสอื่น

Viewคุณสามารถยืนยันว่าการสร้างหน้าต่างใหม่เป็นงานสำหรับการ ในขณะที่ฉันไม่เห็นด้วยมีค่าเล็กน้อยในการอภิปรายเช่นนี้เพราะในทางปฏิบัติมันไม่ได้เป็นการสิ้นสุดของโลกถ้าคุณวางรหัสนั้นไว้ในViewนั้นและมันก็ไม่ได้ทำงานมากนักที่จะย้ายมันไปViewModelที่จุดถัดไป . ส่วนที่สำคัญคือตรรกะสำหรับการสร้างหน้าต่างใหม่นั้นมีอยู่ในคลาสอิสระมักจะเป็น WindowFactory บางประเภท ประเด็นของ MVVM, MVP, MVC และอื่น ๆ คือคุณมีคลาสที่มีความรับผิดชอบน้อยและกำหนดไว้อย่างดี นั่นเป็นเหตุผลที่คุณไม่ได้เพิ่มความรับผิดชอบเพิ่มเติมเพื่อView, ViewModelหรือModelถ้าคุณทำไม่จำเป็นต้อง

ไม่ว่าในกรณีใดการสร้างหน้าต่างเป็นของModelเพราะModelไม่ทราบว่ามีบางสิ่งบางอย่างเช่น GUI

คำตอบที่เป็นประโยชน์

นี่เป็นเรื่องเกี่ยวกับ"เครื่องมือที่มีลักษณะคล้ายหน้าต่างเดียวที่มีปุ่ม" ส่ง "เดียว ดังนั้นนี่คือปลั๊กไร้ยางอายสำหรับคำตอบที่เกี่ยวข้องของฉัน: ทำไมต้องใช้ MVVM?

เพื่อสรุปสิ่งที่คำตอบบอกว่า: ทำให้ง่าย โอ้และเก็บคำตอบทางทฤษฎีไว้ในใจเพื่อนำไปใช้เมื่อหน้าต่างปุ่มเดียวของคุณเริ่มซับซ้อนมากขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.