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


159

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



5
これは良い質問のようです。投票と星を見る..
nawfal 2012

13
それがまさに私が探していた会話であるとき、これはどのように建設的ではありませんか?適度ではなく、指示してください!
CADブローク2013

したがって、基本的に、MVVM for WinFormsが可能です。しかし、ほとんどの人は、Winforms / MVVMのアイデアを前進させるのではなく、過去にMVP / MVCをどのように使用したかについて話したいと思います。または、むしろそれがMVVMではなくPresenter Modelと実際にどのように呼ばれるか、およびMVVMがWPFにとってどの程度優れているかについて詳しく説明します。
H.アブラハムチャベス

9
このタイプの質問が「建設的ではない」と閉じられたときはいつもがっかりします。別のポスターがすでに述べたように、このタイプの議論はまさに私がここで探していたものだからです。モデレーター、もっと寛大な見方をして、「建設的でない」ボタンを緩和してください。
Tim Long

回答:


94

私は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);
   }
}

1
おかげで、その本の例は私の好みには少し単純すぎる。WinformsやMVPで、TreeViewやDataGridViewなどのより複雑なデータ表示をどのように実行すれば、どのくらい(どのような)ロジックがどこに常駐しますか?
bitbonk 2009年

bitbonk-回答を更新しました。詳細を確認できるかどうかを確認します。
rajesh pillai 2009年

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

1
それは欠陥ではありません。これは、MVPパターンの「スーパーバイザーコントローラー」フレーバーです。スーパーバイザーコントローラーでは、ビューはモデルを認識します(これはプレゼンテーションモデルです)。もう1つは「パッシブビュー」で、ビューはモデルから完全に切り離されています。
rajesh pillai 2009年

14

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

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

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

WAF Windowsはアダプターのフォーム WindowsフォームアプリケーションでMVVMパターンを適用する方法を示します。


3
WAFはWindowsフォームではなくWPF用です。リンクは誤解を招くものです。
ベントレーデイビス

2
リンクは誤解を招くものではありません。WAF Windowsフォームアダプターには、2回実装されるMVVMアプリケーションが付属しています。1. WinForms; 2. WPF。どちらのアプリケーションも、UIテクノロジーに依存しない下位層を共有しています。
jbe 2012年

5

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

MVVM for .NET Winforms

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


4

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

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

この場合も、MVVM for WinFormsを使用できますか?はい、できます。すべてのピースがあります。私たちはそれらを一緒に接着する必要があります。


4

MVPは、WinFormsの開発に適したパターンであると思います。 CAB Microsoftの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の記事


Boodhooのものは、WinFormsではなくWebFormsに関するもののようです。ビデオの後半に他のものがない限り...?
Roger Lipscombe

3

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

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

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

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

繰り返しになりますが、これの鍵は、各レイヤーが互いにどのように相互作用するかを正確に定義するためのインターフェースの使用です。

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

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

3

2

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.