Mẫu thiết kế giao diện người dùng cho Windows Forms (như MVVM cho WPF)


159

MVVM được sử dụng phổ biến nhất với WPF vì nó hoàn toàn phù hợp với nó. Nhưng những gì về Windows Forms? Có một cách tiếp cận được thiết lập và sử dụng phổ biến như thế này cho Windows Forms không? Một hoạt động rõ ràng tốt với Windows Forms? Có một cuốn sách hoặc một bài viết mô tả tốt điều này? Có thể dựa trên MVP hoặc MVC?



5
đây có vẻ là một câu hỏi hay xem phiếu bầu và ngôi sao ..
nawfal

13
Làm thế nào điều này không mang tính xây dựng khi nó chính xác là cuộc trò chuyện mà tôi đang tìm kiếm? Trung bình, không sai khiến!
CAD bloke

Về cơ bản, MVVM cho WinForms là có thể. Nhưng hầu hết mọi người muốn nói về cách họ đã sử dụng MVP / MVC trong quá khứ, thay vì đẩy ý tưởng Winforms / MVVM về phía trước. Hoặc họ tập trung vào cách nó thực sự được gọi là Mô hình Người trình bày không phải là MVVM và MVVM ngọt ngào như thế nào đối với WPF.
H. Abraham Chavez

9
Tôi luôn thất vọng khi loại câu hỏi này bị đóng là "không mang tính xây dựng" vì, như một poster khác đã được đề cập, loại thảo luận này chính xác là những gì tôi đến đây tìm kiếm. Người điều hành, vui lòng có một cái nhìn tự do hơn và dễ dàng hơn với nút 'không mang tính xây dựng'.
Tim Long

Câu trả lời:


94

Tôi đã thử MVP và nó dường như cũng hoạt động tốt với các hình thức windows. Cuốn sách này có một ví dụ về các hình thức cửa sổ với mẫu MVP (ứng dụng bảng lương mẫu). Ứng dụng này không phức tạp lắm nhưng sẽ cho bạn ý tưởng về cách tạo ra nó.

Nguyên tắc, mô hình và thực tiễn nhanh nhẹn trong C # ...

Bạn có thể lấy mã nguồn tại Mã nguồn

BIÊN TẬP:

Có hai biến thể của mẫu MVP (a) Chế độ xem thụ động và (b) bộ điều khiển giám sát

Đối với các kịch bản liên kết dữ liệu phức tạp, tôi thích sử dụng mẫu điều khiển Giám sát. Trong giám sát mẫu điều khiển, trách nhiệm cơ sở dữ liệu còn lại với khung nhìn. Vì vậy, đối với treeview / datagrid, điều này phải nằm trong các khung nhìn tương ứng, chỉ nên xem logic bất khả tri nên được chuyển sang người trình bày.

Tôi khuyên bạn nên xem qua MVP framework MVC # sau - Khung MVP

Đừng gọi tên (đó là khung MVP).

Winforms đơn giản Video MVP Winforms - MVP

Một ví dụ về xử lý danh sách thả xuống MVP - DropDownList

Ví dụ ràng buộc treeview đơn giản (ràng buộc của người nghèo). Bạn có thể thêm bất kỳ logic cụ thể nào của treeview trong BindTree ().

Dưới đây là đoạn mã .... không được kiểm tra, được nhập trực tiếp từ ý nghĩ ....

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
Cảm ơn, ví dụ trong cuốn sách đó là một chút quá đơn giản cho sở thích của tôi. Làm thế nào tôi có thể tìm hiểu về Winforms và MVP với hiển thị dữ liệu phức tạp hơn như TreeView hoặc DataGridView, logic (cái gì) sẽ nằm ở đâu?
bitbonk

bitbonk - Tôi đã cập nhật câu trả lời và sẽ kiểm tra xem tôi có thể biết thêm thông tin không.
rajesh Pillai

1
Phương pháp BindTree có vẻ hơi thiếu sót đối với tôi. Đột nhiên, View biết abou Model. Đó có phải là một điều tốt? Phải có hàng tấn poeple đang phải đối mặt với những vấn đề như thế này. Tôi ngạc nhiên rằng không có bất kỳ cuốn sách về nó. Vì có những cuốn sách về mọi thứ trong thế giới .NET.
bitbonk

1
Đó không phải là một lỗ hổng. Đây là hương vị "Bộ điều khiển giám sát" của mẫu MVP .. Trong Bộ điều khiển giám sát, chế độ xem nhận biết về mô hình (đây là mô hình trình bày). Cái còn lại là "Chế độ xem thụ động", trong đó chế độ xem hoàn toàn tách rời khỏi mô hình.
rajesh Pillai

14

Như đã nói, tôi luôn làm việc theo mô hình MVP khi sử dụng Winforms. Nhưng mẫu thiết kế bạn sẽ sử dụng không có nghĩa là bạn sẽ sử dụng đúng. Có vô số mô hình chống gắn liền với MVP.

Nếu bạn muốn bắt đầu mọi thứ theo cách tốt, bạn phải sử dụng khuôn khổ để xây dựng ứng dụng khách thông minh. Vì vậy, tôi sẽ khuyên bạn nên sử dụng thiết kế và thực tiễn đó: Nhà máy phần mềm khách hàng thông minh http://www.codeplex.com/smartclient

Bạn có một cuộc thảo luận ở đây về các khung khách hàng thông minh hiện tại: http://codebetter.com/bloss/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS: Tôi thích bài đăng này trên các mẫu chống MVP: http://blog.mattwynne.net/2007/06/13/mvp-smells/

Hi vọng điêu nay co ich


9

Các Model-View-ViewModel (MVVM) Pattern là một mẫu thiết kế. Theo định nghĩa, một mẫu thiết kế cho thấy một giải pháp phổ biến trong thế giới hướng đối tượng và giải pháp này có thể được áp dụng trong các nền tảng khác nhau (WPF, WinForms, Java Swing, v.v.). Tôi đồng ý rằng MVVM được sử dụng tốt nhất với WPF vì nó tận dụng các khả năng ràng buộc mạnh mẽ. Tuy nhiên, Windows Forms cũng hỗ trợ liên kết dữ liệu.

Bộ điều hợp Windows Forms của WAF cho thấy cách áp dụng Mẫu MVVM trong ứng dụng Windows Forms.


3
WAF dành cho WPF, không phải Windows Forms. Các liên kết là sai lệch.
Bentley Davis

2
Các liên kết không gây hiểu lầm. WAF Windows Forms Adapter đi kèm với một ứng dụng MVVM được triển khai hai lần: 1. WinForms; 2. WPF. Cả hai ứng dụng đều chia sẻ các lớp thấp hơn, độc lập với công nghệ UI.
JBE

5

Tôi đã viết về một biến thể của các mẫu thiết kế MVP / MVVM được gọi là MVP-VM, đây là một giải pháp được thiết kế riêng cho các ứng dụng winforms yêu cầu bảo hiểm thử nghiệm đầy đủ và sử dụng ràng buộc dữ liệu làm cơ chế chính để giữ cho bản trình bày được cập nhật với dữ liệu mô hình.

MVVM cho .NET Winforms

MVVM (Model View View Model) giới thiệu cách tiếp cận tương tự để tách bản trình bày khỏi dữ liệu trong môi trường trao quyền liên kết dữ liệu (WPF). Do .NET framework 2.0 đã cung cấp cơ sở hạ tầng liên kết dữ liệu nâng cao, cũng cho phép liên kết thời gian thiết kế của các đối tượng ứng dụng - thực thể 'Mô hình xem' có thể phù hợp khá tốt trong môi trường dựa trên MVP.


4

Tôi đã hỏi câu hỏi tương tự với hai đồng nghiệp công nghệ của tôi: MVVM cho WindowsForms có khả thi không? Cả hai đều cho tôi câu trả lời chính xác: " Không thể nào! WindowsForms thiếu các ràng buộc phong phú của WPF và Silverlight (OneTime, OneWay, TwoWay, OnewayToSource) và nó cũng thiếu TypeConverters ."

  • Mẫu Trình kích hoạt màn hình cho WindowsForms - bạn có thể tìm thấy nó ở đây , được chuyển từ Caliburn.Micro bởi jagui
  • Rich Bindings và TypeConverters - Truss của Kent Boogaart, thực hiện theo cách độc lập UI
  • Các lệnh - Khung ứng dụng WPF (WAF) có dự án WafWinFormsAd CHƯƠNG, chăm sóc một số công cụ MVVM cụ thể là các lệnh

Một lần nữa, chúng ta có thể có MVVM cho WinForms không? Vâng, chúng tôi có thể. Chúng tôi có tất cả các mảnh. Chúng ta chỉ cần dán chúng lại với nhau.


4

Tôi tin rằng MVP là một mô hình phù hợp với sự phát triển của WinForms - một phần được chứng minh bằng việc sử dụng nó trong CAB - khuôn khổ của Microsoft cho WinForms.

Tôi sử dụng MVP trong WinForms để trích xuất mã ra khỏi Chế độ xem - vì tôi không thể kiểm tra mã Xem. Và cũng để cho phép mã cần được sử dụng lại (hoặc được sao chép) để đứng ngoài Chế độ xem nơi không thể chia sẻ.

Tôi có thể tham khảo dự án của riêng mình nơi tôi sử dụng mẫu MVP ExceptionReporter.NET . Mặc dù tôi chắc chắn rằng tôi không sử dụng nó một cách hoàn hảo.

Bạn đã đề cập MVVM làm việc cho WPF - Tôi nghĩ lý do cho điều đó là vì hỗ trợ liên kết dữ liệu mạnh mẽ. Nếu bạn không sử dụng liên kết dữ liệu trong WPF (và chắc chắn không bắt buộc) thì bạn có thể chọn MVP. Vấn đề là MVP là một lựa chọn mạnh mẽ cho bất kỳ ứng dụng phía khách nào. Và có thể là lựa chọn 'tốt hơn', ngay cả trong WPF, nếu bạn có kế hoạch chia sẻ mã giữa các dự án không phải là WPF.

Để biết thêm bằng chứng về giá trị của việc sử dụng MVP trong WinForms, hãy xem bản trình bày video của Boodhoo khi sử dụng MVP: http://www.bestechideo.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter Và một bài viết MSDN của cùng một tác giả tại http://msdn.microsoft.com/en-us/magazine/cc188690.aspx


Nội dung của Boodhoo dường như là về WebForms, không phải WinForms. Trừ khi có nhiều thứ sau này trong video ...?
Roger Lipscombe

3

Phương pháp BindTree có vẻ hơi thiếu sót đối với tôi. Đột nhiên, View biết abou Model. Đó có phải là một điều tốt? Phải có hàng tấn poeple đang phải đối mặt với những vấn đề như thế này. Tôi ngạc nhiên rằng không có bất kỳ cuốn sách về nó. Vì có những cuốn sách về mọi thứ trong thế giới .NET.

Các Thiết kế này không phải về việc ẩn mô hình mà xác định chính xác các tương tác giữa các lớp khác nhau của ứng dụng. Bạn có thể thay đổi hoàn toàn phụ trợ và miễn là bạn vượt qua Mô hình thông qua Bindtree, giao diện người dùng của bạn sẽ tiếp tục hoạt động.

Bây giờ lớp Model có thể là một lựa chọn nghèo nàn về tên trong ví dụ mà Rajesh đưa ra. Nó có thể là TreeData hoặc RecordsData. Tuy nhiên, bạn xác định nó, nó có những gì bạn cần để sử dụng cơ chế liên kết của Winforms để liên kết một điều khiển cụ thể với dữ liệu cơ bản.

Trang web tốt nhất để duyệt tìm loại tài liệu này là ở đây . Martin Fowler đã thu thập một loạt các mẫu thiết kế UI và mẫu thiết kế doanh nghiệp hữu ích.

Một lần nữa, mấu chốt của vấn đề này là việc sử dụng các giao diện để xác định chính xác cách mỗi lớp tương tác với nhau.

Trong ứng dụng của riêng tôi (một ứng dụng CAD / CAM được sử dụng để chạy máy cắt kim loại), cấu trúc của tôi trông như thế này.

  • Biểu mẫu thực hiện giao diện biểu mẫu
  • UIDLL với các khung nhìn triển khai các giao diện khung nhìn tương tác với các biểu mẫu thông qua giao diện biểu mẫu. Các khung nhìn cụ thể tự đăng ký với UIViewDLL Views thực thi các Đối tượng lệnh được tìm thấy trong các thư viện lệnh tương tác với Mô hình.
  • Thư viện chỉ huy; danh sách các lệnh thực hiện ICommand. Lệnh tương tác với các khung nhìn thực hiện thông qua các giao diện được hiển thị trong UIViewDLL.
  • UIViewDLL; hiển thị Giao diện Xem được sử dụng bởi các lệnh.
  • Mô hình; các lớp và bộ sưu tập tạo nên cấu trúc dữ liệu cốt lõi của ứng dụng của tôi. Đối với tôi đây là những thứ như vật liệu, đường cắt, hình dạng, tấm, đuốc, v.v.
  • Tiện ích; một DLL có các lớp tiện ích thường được sử dụng bởi công ty của tôi trải rộng trên các ứng dụng khác nhau. Ví dụ các hàm toán học phức tạp.

3

Bạn có thể sử dụng Kiến trúc, mô hình và thực tiễn doanh nghiệp làm điểm bắt đầu, mặc dù chúng hơi cũ.

Theo Hướng dẫn chung, có Kiến trúc ứng dụng cho .NET: Thiết kế ứng dụng và dịch vụ , đây là phần giới thiệu tốt về các cách .NET và ứng dụng N-tier được xếp lớp.

văn bản thay thế http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

Đối với "mẫu" chính thức hơn, có Mẫu giải pháp doanh nghiệp sử dụng Microsoft .NET . (nguồn: microsoft.com )văn bản thay thế

Đến tên một vài,


2

Lời giải thích tốt đầu tiên về các mẫu thiết kế UI mà tôi đã đọc là trong blog của Jeremy Miller - Xây dựng CAB của riêng bạn . Nó mô tả các mẫu phổ biến - Chế độ xem thụ động, MVP, v.v. và giải quyết một số cách bạn có thể triển khai chúng trong C #.


1

Bạn có thể dùng thử MugenMvvmToolkit cho phép sử dụng "MVVM thuần" cho WinForms. Do thực tế là nó hỗ trợ các liên kết trên tất cả các nền tảng, tất cả các tính năng liên kết gốc có sẵn cho nền tảng WPF có sẵn trên tất cả các nền tảng (bao gồm WinForms).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.