web-dev-qa-db-ja.com

WindowsフォームのUIデザインパターン(MVPF for WPFなど)

MVVMは、WPFに最適であるため、WPFで最も一般的に使用されます。しかし、Windows Formsはどうでしょうか? Windows Formsに対しても、このような確立され一般的に使用されているアプローチ/デザインパターンはありますか? Windowsフォームで明示的にうまく機能するものは?これをよく説明している本や記事はありますか? MVPまたはMVCベースですか?

152
bitbonk

MVPを試しましたが、Windowsフォームでもうまく機能するようです。この本には、MVPパターン(給与計算アプリケーションのサンプル)を使用したWindowsフォームの例があります。アプリケーションはそれほど複雑ではありませんが、作成方法についてのアイデアを提供します。

C#のアジャイルの原則、パターン、およびプラクティス ...

ソースコードは ソースコード で取得できます。

編集:

MVPパターンには2つのバリエーションがあります(a)パッシブビューと(b)監督コントローラー

複雑なデータバインディングシナリオの場合は、監督コントローラーパターンを使用することを好みます。監視コントローラーパターンでは、データバインディングの責任はビューにあります。したがって、ツリービュー/データグリッドの場合、これはそれぞれのビューにある必要があり、ビューに依存しないロジックのみがプレゼンターに移動する必要があります。

次のMVPフレームワークをご覧になることをお勧めします MVC#-MVPフレームワーク

名前で行かないでください(MVPフレームワークです)。

シンプルなwinforms MVPビデオ Winforms-MVP

ドロップダウンリストを扱う例 MVP-DropDownList

単純なツリービューバインディングの例(貧しい人のバインディング)。 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);
   }
}
91
rajesh pillai

既に述べたように、Winformsを使用するときは常にMVPパターンで作業していました。ただし、使用するデザインパターンは、適切に使用するという意味ではありません。 MVPには多数のアンチパターンが付加されています。

すべてを適切に開始する場合は、スマートクライアントを構築するためのフレームワークを使用する必要があります。したがって、私はその設計と実践を使用することをお勧めします:Smart Client Software Factoryhttp://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/

お役に立てれば

14
alexl

Model-View-ViewModel(MVVM)パターンは設計パターンです。定義によれば、デザインパターンはオブジェクト指向の世界における一般的なソリューションを示しており、このソリューションはさまざまなプラットフォーム(WPF、WinForms、Java Swingなど)に適用できます。 MVVMは強力なバインディング機能を活用するため、WPFでの使用が最適であることに同意します。ただし、Windowsフォームはデータバインディングもサポートしています。

WAF Windows Forms Adapterは、Windows FormsアプリケーションでMVVMパターンを適用する方法を示しています。

9
jbe

MVP-VMと呼ばれるMVP/MVVM設計パターンのバリエーションについて書きました。MVP-VMは、完全なテストカバレッジを必要とし、プレゼンテーションをモデルデータで更新し続けるための主要なメカニズムとしてデータバインディングを使用するwinformsアプリケーション向けのオーダーメイドソリューションです。

MVVM for .NET Winforms

MVVM(モデルビュービューモデル)は、データバインディング(WPF)を強化する環境で、プレゼンテーションをデータから分離するための同様のアプローチを導入します。 .NET framework 2.0はすでにアプリケーションオブジェクトの設計時バインディングを可能にする高度なデータバインディングインフラストラクチャを提供しているため、「ビューモデル」エンティティはMVPベースの環境に非常によく適合します。

5
Aviad Ezra

この同じ質問を2人の技術者に依頼しました。WindowsFormsのMVVMは可能ですか?どちらも私にまったく同じ答えを与えました: "いや!WindowsFormsにはWPFとSilverlight(OneTime、OneWay、TwoWay、OnewayToSource)の豊富なバインディングがなく、TypeConverters。」

  • WindowsFormsのスクリーンアクティベーターパターン-あなたはそれを見つけることができます here 、jaguiによってCaliburn.Microから移植されました
  • リッチバインディングとTypeConverters- Truss Kent Boogaartによる、UIに依存しない方法で行う
  • コマンド- WPF Application Framework(WAF) には、MVVMの一部、つまりコマンドを処理するWafWinFormsAdapterプロジェクトがあります

繰り返しますが、MVVM for WinFormsを使用できますか?はい、できます。すべてが揃っています。それらを接着するだけです。

4

CAB -WinFormsのMicrosoftのフレームワークでの使用によって部分的に証明されているように、MVPはWinFormsの開発に適したパターンであると考えています。

ビューコードをテストできないため、WinFormsでMVPを使用してビューからコードを抽出します。また、再利用(または複製)する必要があるコードを、共有できないビューから外れるようにすることもできます。

MVPパターン ExceptionReporter.NET を使用する自分のプロジェクトを参照できます。私は完全にそれを使用しないと確信していますが。

MVVMがWPFで機能しているとおっしゃいましたが、その理由は強力なデータバインディングサポートによるものだと思います。 WPFでデータバインディングを使用していなかった場合(および強制ではありません)、MVPを選択できます。ポイントは、MVPがクライアント側のアプリケーションにとって強力な選択であることです。 WPFではないプロジェクト間でコードを共有する予定がある場合は、WPFであっても、「より良い」選択になる可能性があります。

WinFormsでMVPを使用する価値のさらなる証拠については、MVPの使用に関するBoodhooのビデオプレゼンテーションを参照してください。 http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo -on-model-view-presenter そして、同じ著者による http://msdn.Microsoft.com/en-us/magazine/cc188690.aspx のMSDN記事

4
PandaWood

Enterprise Architecture、Patterns and Practices を開始点として使用できますが、それらは少し古いものです。

一般的なガイダンスの下に 。NETのアプリケーションアーキテクチャ:アプリケーションとサービスの設計 があります。これは.NETの方法と階層化されたN層アプリケーションの優れた入門書です。

代替テキストhttp://i.msdn.Microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

より正式な「パターン」には、 Microsoft .NETを使用したエンタープライズソリューションパターン があります。 alt text
(ソース: Microsoft.com

いくつか例を挙げると、

3
Eugene Yokota

BindTreeメソッドには少し欠陥があるようです。突然、ビューはモデルを知っています。それは良いことですか?この種の問題に直面している人々はたくさんいるに違いありません。私はそれについての本がないことに驚いています。 .NETの世界にはあらゆるものに関する本があるので。

これらの設計は、モデルを非表示にすることではなく、アプリケーションの異なるレイヤー間の相互作用を正確に定義します。バックエンドを完全に変更できます。Bindtreeを介してモデルを渡す限り、UIは引き続き機能します。

現在、クラスModelは、Rajeshが提供する例の名前の不適切な選択である場合があります。 TreeDataまたはRecordsDataのいずれかです。どのように定義しても、Winformsのバインディングメカニズムを使用して特定のコントロールを基になるデータにバインドするために必要なものがあります。

この種の資料を閲覧するのに最適なサイトは here です。 Martin Fowlerは、さまざまな便利なUIデザインパターンとエンタープライズデザインパターンを収集しました。

繰り返しになりますが、ここで重要なのは、各レイヤーが相互作用する方法を正確に定義するインターフェースの使用です。

私自身のアプリケーション(金属切断機の実行に使用されるCAD/CAMアプリケーション)では、私の構造は次のようになります。

  • フォームインターフェイスを実装するフォーム
  • フォームインターフェイスを介してフォームとやり取りするビューインターフェイスを実装するビューを持つUIDLL。特定のビューはUIViewDLLに登録され、ビューは、モデルと対話するコマンドライブラリにあるコマンドオブジェクトを実行します。
  • コマンドライブラリ; ICommandを実装するコマンドのリスト。ビューと対話するコマンドは、UIViewDLLで公開されているインターフェイスを介して実行します。
  • UIViewDLL;コマンドで使用されるビューインターフェイスを公開します。
  • 型;アプリケーションのコアデータ構造を構成するクラスとコレクション。私にとって、これらは材料、切断経路、形状、シート、トーチなどのようなものです。
  • ユーティリティ;さまざまなアプリケーションにまたがる、私の会社で使用されているユーティリティクラスを一般的に使用しているDLL。たとえば、複雑な数学関数。
3
RS Conley

私が読んだUIデザインパターンの最初の良い説明は、Jeremy Millerのブログ Building Your Own CAB でした。一般的なパターン-パッシブビュー、MVPなどについて説明し、C#でそれらを実装する方法のいくつかを説明します。

2
Jeremy

MugenMvvmToolkit を試すことができます。これにより、WinFormsに「純粋なMVVM」を使用できます。すべてのプラットフォームでバインディングをサポートしているため、すべてのプラットフォームで使用可能なWPFプラットフォームで使用可能なすべてのネイティブバインディング機能(WinFormsを含む)。

1