รูปแบบการออกแบบ UI สำหรับแบบฟอร์ม Windows (เช่น MVVM สำหรับ WPF)


159

MVVM มักใช้กับ WPF เพราะมันเหมาะที่สุดสำหรับมัน แต่ Windows Forms เป็นอย่างไรบ้าง มีรูปแบบวิธีการ / ออกแบบที่เป็นที่ยอมรับและใช้กันทั่วไปเช่นนี้สำหรับ Windows Forms หรือไม่ รูปแบบที่ใช้งานได้ดีกับ Windows Forms หรือไม่ มีหนังสือหรือบทความที่อธิบายสิ่งนี้ได้ดีหรือไม่? อาจจะเป็น MVP หรือ MVC?



5
นี่เป็นคำถามที่ดี ดูคะแนนเสียงและดาว ..
nawfal

13
สิ่งนี้ไม่สร้างสรรค์เมื่อเป็นบทสนทนาที่ฉันค้นหา ปานกลางไม่ได้กำหนด!
CAD bloke

ดังนั้นโดยทั่วไป MVVM สำหรับ WinForms จึงเป็นไปได้ แต่คนส่วนใหญ่ค่อนข้างจะพูดคุยเกี่ยวกับวิธีที่พวกเขาเคยใช้ MVP / MVC ในอดีตแทนที่จะผลักดันแนวคิด Winforms / MVVM ไปข้างหน้า หรือพวกเขาจะอาศัยอยู่กับวิธีที่เรียกว่า Presenter Model ไม่ใช่ MVVM และ MVVM ที่น่ารักสำหรับ WPF เป็นอย่างไร
H. อับราฮัมชาเวซ

9
ฉันผิดหวังเสมอเมื่อคำถามประเภทนี้ปิดเป็น "ไม่สร้างสรรค์" เนื่องจากมีผู้โพสต์คนอื่นพูดถึงแล้วการสนทนาประเภทนี้เป็นสิ่งที่ฉันมาที่นี่อย่างแน่นอน ผู้ดำเนินรายการโปรดใช้มุมมองแบบเสรีมากขึ้นและทำให้ง่ายขึ้นที่ปุ่ม 'ไม่สร้างสรรค์'
Tim Long

คำตอบ:


94

ฉันได้ลอง MVP และดูเหมือนว่าจะใช้งานได้ดีกับฟอร์ม windows เช่นกัน หนังสือเล่มนี้มีตัวอย่างของแบบฟอร์ม windows ที่มีรูปแบบ MVP (ตัวอย่างแอปพลิเคชันบัญชีเงินเดือน) แอปพลิเคชั่นนั้นไม่ซับซ้อน แต่จะทำให้คุณมีความคิดเกี่ยวกับการสร้างมันขึ้นมา

หลักการรูปแบบและการปฏิบัติที่คล่องตัวใน C # ...

คุณสามารถรับซอร์สโค้ดได้ที่ Source Code

แก้ไข:

รูปแบบ MVP (ก) มุมมองแบบพาสซีฟและตัวควบคุมการกำกับดูแลมีสองรูปแบบ

สำหรับสถานการณ์ฐานข้อมูลที่ซับซ้อนฉันต้องการไปกับรูปแบบของตัวควบคุม ในการควบคุมรูปแบบการควบคุมนั้นความรับผิดชอบของฐานข้อมูลจะอยู่ในมุมมอง ดังนั้นสำหรับ treeview / datagrid สิ่งนี้ควรอยู่ในมุมมองที่เกี่ยวข้องเฉพาะตรรกะมุมมองที่ไม่เชื่อเรื่องพระเจ้าเท่านั้นที่ควรย้ายไปยังผู้นำเสนอ

ฉันจะแนะนำให้ดูที่กรอบ MVP ต่อไปนี้ MVC # - กรอบ MVP

อย่าไปตามชื่อ (เป็นกรอบ MVP)

วิดีโอ winforms ง่าย ๆ MVP Winforms - MVP

ตัวอย่างของการจัดการกับรายการแบบหล่นลง MVP - DropDownList

ตัวอย่างการเชื่อมโยง treeview อย่างง่าย (การผูกชายที่ไม่ดี) คุณสามารถเพิ่มตรรกะเฉพาะ treeview ใน BindTree ()

ด้านล่างนี้เป็นข้อมูลโค้ด .... ไม่ผ่านการทดสอบโดยใส่รหัสโดยตรงจากความคิด ....

public interface IYourView
{
   void BindTree(Model model);
}

public class YourView : System.Windows.Forms, IYourView
{
   private Presenter presenter;

   public YourView()
   {
      presenter = new YourPresenter(this);
   }

   public override OnLoad()
   {
         presenter.OnLoad();
   }

   public void BindTree(Model model)
   {
       // Binding logic goes here....
   }
}

public class YourPresenter
{
   private IYourView view;

   public YourPresenter(IYourView view)
   { 
       this.view = view;
   }

   public void OnLoad()
   {
       // Get data from service.... or whatever soruce
       Model model = service.GetData(...);
       view.BindTree(model);
   }
}

1
ขอบคุณตัวอย่างในหนังสือเล่มนั้นเรียบง่ายเกินไปสำหรับรสนิยมของฉัน ฉันจะไปใน Winforms และ MVP ด้วยการแสดงข้อมูลที่ซับซ้อนมากขึ้นเช่น TreeView หรือ DataGridView เท่าใดตรรกะ (อะไร) จะอยู่ที่ไหน?
bitbonk

bitbonk - ฉันอัพเดตคำตอบแล้วและจะตรวจสอบว่าฉันสามารถรับข้อมูลเพิ่มเติมได้หรือไม่
rajesh pillai

1
วิธีการ BindTree ดูเหมือนจะมีข้อบกพร่องเล็กน้อยสำหรับฉัน ทันใดนั้นมุมมองก็รู้ตัวโมเดลอยู่ นั่นเป็นสิ่งที่ดีหรือไม่? ต้องมีคนจำนวนมากที่ต้องเผชิญกับปัญหาเหล่านี้ ฉันประหลาดใจที่ไม่มีหนังสือเกี่ยวกับเรื่องนี้ เนื่องจากมีหนังสือเกี่ยวกับทุกสิ่งในโลก. NET
bitbonk

1
นั่นไม่ใช่ข้อบกพร่อง นี่คือรสชาติ "Supervisory Controller" ของรูปแบบ MVP .. ในตัวควบคุมหัวหน้ามุมมองจะรับรู้ถึงรูปแบบ (นี่คือรูปแบบการนำเสนอ) อีกอันคือ "มุมมองแบบพาสซีฟ" ซึ่งมุมมองนั้นแยกออกจากตัวแบบโดยสิ้นเชิง
rajesh pillai

14

ตามที่ได้กล่าวไปแล้วฉันมักจะทำงานในรูปแบบ MVP เมื่อใช้ Winforms แต่รูปแบบการออกแบบที่คุณจะใช้ไม่ได้หมายความว่าคุณจะใช้ถูกต้อง มีแอนตี้ - แพทเทิร์นที่แนบมากับ MVP จำนวนมาก

หากคุณต้องการเริ่มต้นทุกอย่างอย่างดีคุณต้องใช้กรอบงานในการสร้างลูกค้าอัจฉริยะ ดังนั้นฉันจะแนะนำให้ใช้การออกแบบและการปฏิบัตินั้น: โรงงานซอฟต์แวร์ไคลเอนต์สมาร์ท http://www.codeplex.com/smartclient

คุณมีการสนทนาที่นี่เกี่ยวกับเฟรมเวิร์กไคลเอ็นต์อัจฉริยะปัจจุบัน: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: ฉันชอบโพสต์นี้ในรูปแบบการต่อต้าน MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

หวังว่านี่จะช่วยได้


9

Model-View-ViewModel (MVVM)รูปแบบคือรูปแบบการออกแบบ ตามคำจำกัดความรูปแบบการออกแบบแสดงโซลูชันทั่วไปในโลกเชิงวัตถุและโซลูชันนี้สามารถใช้ได้กับแพลตฟอร์มต่าง ๆ (WPF, WinForms, Java Swing, ฯลฯ ) ฉันยอมรับว่า MVVM ใช้งานได้ดีที่สุดกับ WPF เพราะใช้ประโยชน์จากความสามารถในการรวมที่รัดกุม อย่างไรก็ตาม Windows Forms รองรับการเชื่อมโยงข้อมูลเช่นกัน

WAF Windows Forms อะแดปเตอร์ที่แสดงให้เห็นถึงวิธีการใช้แบบ MVVM ในการประยุกต์ใช้แบบฟอร์ม Windows


3
WAF สำหรับ WPF ไม่ใช่ Windows Forms ลิงค์นี้ทำให้เข้าใจผิด
Bentley Davis

2
ลิงก์ไม่ทำให้เข้าใจผิด WAF Windows Forms Adapter มาพร้อมกับแอปพลิเคชัน MVVM ซึ่งมีการใช้งานสองครั้ง: 1. WinForms; 2. WPF แอปพลิเคชั่นทั้งสองใช้เลเยอร์ที่ต่ำกว่าซึ่งเป็นอิสระจากเทคโนโลยี UI
jbe

5

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

MVVM สำหรับ. NET Winforms

MVVM (Model View View Model) แนะนำวิธีการที่คล้ายกันสำหรับการแยกงานนำเสนอออกจากข้อมูลในสภาพแวดล้อมที่เสริมการผูกข้อมูล (WPF) เนื่องจาก. NET Framework 2.0 มีโครงสร้างพื้นฐานการเชื่อมโยงข้อมูลขั้นสูงที่ช่วยให้การออกแบบเวลาเชื่อมโยงวัตถุแอพลิเคชัน - นิติบุคคล 'ดูแบบจำลอง' สามารถพอดีค่อนข้างดีในสภาพแวดล้อม MVP ตาม


4

ฉันถามคำถามเดียวกันนี้กับเพื่อนร่วมงานด้านเทคโนโลยีสองคนของฉัน: MVVM สำหรับ WindowsForms เป็นไปได้หรือไม่ ทั้งคู่ให้คำตอบเดียวกันกับฉัน: " ไม่มีทาง! WindowsForms ขาดการเชื่อมโยงที่สมบูรณ์ของ WPF และ Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) และมันก็หายไปจาก TypeConvertersด้วย"

  • รูปแบบการกระตุ้นหน้าจอสำหรับ WindowsForms - คุณสามารถหาได้ที่นี่ , พอร์ตจาก Caliburn.Micro โดย jagui
  • Rich Bindings และ TypeConverters - Truss by Kent Boogaart ทำแบบ UI อย่างอิสระ
  • คำสั่ง - WPF Application Framework (WAF)มีโครงการ WafWinFormsAdapter ที่ดูแลบางสิ่ง MVVM คือคำสั่ง

อีกครั้งเราสามารถมี MVVM สำหรับ WinForms ได้หรือไม่ ใช่เราทำได้ เรามีชิ้นส่วนทั้งหมด เราแค่ต้องติดมันเข้าด้วยกัน


4

ฉันเชื่อว่า MVP เป็นรูปแบบที่เหมาะสมกับการพัฒนา WinForms ซึ่งเป็นหลักฐานส่วนหนึ่งจากการใช้งานในCAB - กรอบงานของ Microsoft สำหรับ WinForms

ฉันใช้ MVP ใน WinForms เพื่อแยกรหัสออกจากมุมมอง - เพราะฉันไม่สามารถทดสอบรหัสดูได้ และเพื่อเปิดใช้งานรหัสที่จำเป็นต้องนำมาใช้ซ้ำ (หรือซ้ำซ้อน) เพื่ออยู่นอกมุมมองซึ่งไม่สามารถแชร์ได้

ฉันสามารถอ้างถึงโครงการของตัวเองที่ฉันจะใช้รูปแบบการเล่น MVP ExceptionReporter.NET แม้ว่าฉันจะแน่ใจว่าฉันไม่ได้ใช้อย่างสมบูรณ์แบบ

คุณพูดถึง MVVM ที่ทำงานกับ WPF - ฉันคิดว่าเหตุผลนั้นเป็นเพราะการสนับสนุนข้อมูลที่รัดกุม หากคุณไม่ได้ใช้การเชื่อมโยงข้อมูลใน WPF (และแน่นอนว่าไม่บังคับ) คุณสามารถเลือก MVP ประเด็นคือ MVP เป็นตัวเลือกที่ดีสำหรับแอปพลิเคชันฝั่งไคลเอ็นต์ และอาจเป็นทางเลือกที่ 'ดีกว่า' แม้ใน WPF หากคุณวางแผนที่จะแบ่งปันรหัสระหว่างโครงการที่ไม่ใช่ WPF

สำหรับหลักฐานเพิ่มเติมเกี่ยวกับคุณค่าของการใช้ MVP ใน WinForms ดูการนำเสนอวิดีโอของ Boodhoo เกี่ยวกับการใช้ MVP: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter และบทความ MSDN โดยผู้เขียนคนเดียวกันที่http://msdn.microsoft.com/en-us/magazine/cc188690.aspx


สิ่งที่ Boodhoo ดูเหมือนจะเกี่ยวกับ WebForms ไม่ใช่ WinForms ในวิดีโอมีอีกต่อไป ...
Roger Lipscombe

3

วิธีการ BindTree ดูเหมือนจะมีข้อบกพร่องเล็กน้อยสำหรับฉัน ทันใดนั้นมุมมองก็รู้ตัวโมเดลอยู่ นั่นเป็นสิ่งที่ดีหรือไม่? ต้องมีบทกวีมากมายที่ต้องเผชิญกับปัญหาแบบนี้ ฉันประหลาดใจที่ไม่มีหนังสือเกี่ยวกับเรื่องนี้ เนื่องจากมีหนังสือเกี่ยวกับทุกสิ่งในโลก. NET

การออกแบบเหล่านี้ไม่ได้เกี่ยวกับการซ่อนแบบจำลอง แต่ค่อนข้างจะกำหนดการโต้ตอบระหว่างเลเยอร์ต่างๆของแอปพลิเคชันอย่างแม่นยำ คุณสามารถเปลี่ยนแบ็กเอนด์ได้อย่างสมบูรณ์และตราบใดที่คุณส่งแบบจำลองผ่าน Bindtree UI ของคุณจะยังคงทำงานต่อไป

ตอนนี้คลาสโมเดลอาจเป็นตัวเลือกที่ไม่ดีของชื่อในตัวอย่างที่ราเจชให้ มันอาจเป็น TreeData หรือ RecordsData อย่างไรก็ตามคุณกำหนดมันมีสิ่งที่คุณต้องใช้กลไกการผูกพันของ Winforms เพื่อผูกตัวควบคุมเฉพาะกับข้อมูลพื้นฐาน

เว็บไซต์ที่ดีที่สุดเพื่อดูชนิดของวัสดุนี้อยู่ที่นี่ Martin Fowler ได้รวบรวมรูปแบบการออกแบบ UI ที่มีประโยชน์และรูปแบบการออกแบบองค์กรที่หลากหลาย

กุญแจสำคัญในการทำเช่นนี้คือการใช้อินเทอร์เฟซเพื่อกำหนดว่าแต่ละเลเยอร์โต้ตอบกันอย่างไร

ในแอปพลิเคชันของฉัน (แอปพลิเคชัน CAD / CAM ที่ใช้ในการเรียกใช้เครื่องตัดโลหะ) โครงสร้างของฉันมีลักษณะเช่นนี้

  • แบบฟอร์มการนำอินเตอร์เฟสไปใช้
  • UIDLL ที่มีมุมมองที่ใช้อินเตอร์เฟสมุมมองที่โต้ตอบกับฟอร์มผ่านอินเตอร์เฟสฟอร์ม มุมมองเฉพาะลงทะเบียนด้วย UIViewDLL Views เรียกใช้งาน Command Objects ที่พบในไลบรารีคำสั่งที่โต้ตอบกับ Model
  • ห้องสมุดคำสั่ง; รายการคำสั่งที่ใช้งาน ICommand คำสั่งที่โต้ตอบกับมุมมองทำผ่านอินเตอร์เฟสที่เปิดเผยใน UIViewDLL
  • UIViewDLL; exposes มุมมองอินเตอร์เฟสที่ใช้โดยคำสั่ง
  • รูปแบบ; คลาสและการรวบรวมที่สร้างโครงสร้างข้อมูลหลักของแอปพลิเคชันของฉัน สำหรับฉันเหล่านี้เป็นสิ่งที่ต้องการวัสดุ, ทางลัด, รูปร่าง, แผ่น, คบเพลิง, ฯลฯ
  • ยูทิลิตี้; DLL ที่มีการใช้งานคลาสยูทิลิตี้ที่ บริษัท ของฉันใช้ในการขยายแอปพลิเคชันอื่น ตัวอย่างเช่นฟังก์ชันทางคณิตศาสตร์ที่ซับซ้อน

3

คุณสามารถใช้สถาปัตยกรรมองค์กรรูปแบบและการปฏิบัติเป็นจุดเริ่มต้นแม้ว่าจะเป็นวันที่เล็กน้อย

ภายใต้คำแนะนำทั่วไปจะมีสถาปัตยกรรมแอปพลิเคชันสำหรับ. NET: การออกแบบแอปพลิเคชันและบริการซึ่งเป็นการแนะนำที่ดีเกี่ยวกับวิธีการ. NET และแอปพลิเคชัน N-tier ที่มีเลเยอร์

ข้อความแทน http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10.10%29.gif

สำหรับข้อมูลเพิ่มเติมอย่างเป็นทางการ "รูปแบบ" มีรูปแบบองค์กรโซลูชั่นการใช้ Microsoft .NET (ที่มา: microsoft.com )ข้อความแสดงแทน

เพื่อชื่อไม่กี่


2

คำอธิบายที่ดีครั้งแรกของรูปแบบการออกแบบ UI ผมอ่านอยู่ในบล็อกของเจเรมีมิลเลอร์ - อาคาร CAB มันอธิบายรูปแบบทั่วไป - มุมมองแบบพาสซีฟ MVP ฯลฯ และพูดถึงวิธีที่คุณอาจนำไปใช้ใน C #


1

คุณสามารถลองMugenMvvmToolkitที่อนุญาตให้ใช้ "pure MVVM" สำหรับ WinForms เนื่องจากความจริงที่ว่ามันรองรับการเชื่อมโยงบนทุกแพลตฟอร์มคุณสมบัติการเชื่อมต่อแบบเนทีฟทั้งหมดสำหรับแพลตฟอร์ม WPF ที่มีอยู่ในทุกแพลตฟอร์ม (รวมถึง WinForms)

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