MVVMは、WPFに最適であるため、WPFで最も一般的に使用されます。しかし、Windows Formsはどうでしょうか? Windows Formsに対しても、このような確立され一般的に使用されているアプローチ/デザインパターンはありますか? Windowsフォームで明示的にうまく機能するものは?これをよく説明している本や記事はありますか? MVPまたはMVCベースですか?
MVPを試しましたが、Windowsフォームでもうまく機能するようです。この本には、MVPパターン(給与計算アプリケーションのサンプル)を使用したWindowsフォームの例があります。アプリケーションはそれほど複雑ではありませんが、作成方法についてのアイデアを提供します。
C#のアジャイルの原則、パターン、およびプラクティス ...
ソースコードは ソースコード で取得できます。
MVPパターンには2つのバリエーションがあります(a)パッシブビューと(b)監督コントローラー
複雑なデータバインディングシナリオの場合は、監督コントローラーパターンを使用することを好みます。監視コントローラーパターンでは、データバインディングの責任はビューにあります。したがって、ツリービュー/データグリッドの場合、これはそれぞれのビューにある必要があり、ビューに依存しないロジックのみがプレゼンターに移動する必要があります。
次のMVPフレームワークをご覧になることをお勧めします MVC#-MVPフレームワーク
名前で行かないでください(MVPフレームワークです)。
シンプルなwinforms MVPビデオ Winforms-MVP
ドロップダウンリストを扱う例 MVP-DropDownList
以下は、コードスニペットです...テストされていない、思考から直接キー入力された...
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);
}
}
既に述べたように、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/
お役に立てれば
Model-View-ViewModel(MVVM)パターンは設計パターンです。定義によれば、デザインパターンはオブジェクト指向の世界における一般的なソリューションを示しており、このソリューションはさまざまなプラットフォーム(WPF、WinForms、Java Swingなど)に適用できます。 MVVMは強力なバインディング機能を活用するため、WPFでの使用が最適であることに同意します。ただし、Windowsフォームはデータバインディングもサポートしています。
WAF Windows Forms Adapterは、Windows FormsアプリケーションでMVVMパターンを適用する方法を示しています。
MVP-VMと呼ばれるMVP/MVVM設計パターンのバリエーションについて書きました。MVP-VMは、完全なテストカバレッジを必要とし、プレゼンテーションをモデルデータで更新し続けるための主要なメカニズムとしてデータバインディングを使用するwinformsアプリケーション向けのオーダーメイドソリューションです。
MVVM(モデルビュービューモデル)は、データバインディング(WPF)を強化する環境で、プレゼンテーションをデータから分離するための同様のアプローチを導入します。 .NET framework 2.0はすでにアプリケーションオブジェクトの設計時バインディングを可能にする高度なデータバインディングインフラストラクチャを提供しているため、「ビューモデル」エンティティはMVPベースの環境に非常によく適合します。
この同じ質問を2人の技術者に依頼しました。WindowsFormsのMVVMは可能ですか?どちらも私にまったく同じ答えを与えました: "いや!WindowsFormsにはWPFとSilverlight(OneTime、OneWay、TwoWay、OnewayToSource)の豊富なバインディングがなく、TypeConverters。」
繰り返しますが、MVVM for WinFormsを使用できますか?はい、できます。すべてが揃っています。それらを接着するだけです。
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記事
Enterprise Architecture、Patterns and Practices を開始点として使用できますが、それらは少し古いものです。
一般的なガイダンスの下に 。NETのアプリケーションアーキテクチャ:アプリケーションとサービスの設計 があります。これは.NETの方法と階層化されたN層アプリケーションの優れた入門書です。
代替テキストhttp://i.msdn.Microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif
より正式な「パターン」には、 Microsoft .NETを使用したエンタープライズソリューションパターン があります。
(ソース: Microsoft.com )
いくつか例を挙げると、
BindTreeメソッドには少し欠陥があるようです。突然、ビューはモデルを知っています。それは良いことですか?この種の問題に直面している人々はたくさんいるに違いありません。私はそれについての本がないことに驚いています。 .NETの世界にはあらゆるものに関する本があるので。
これらの設計は、モデルを非表示にすることではなく、アプリケーションの異なるレイヤー間の相互作用を正確に定義します。バックエンドを完全に変更できます。Bindtreeを介してモデルを渡す限り、UIは引き続き機能します。
現在、クラスModelは、Rajeshが提供する例の名前の不適切な選択である場合があります。 TreeDataまたはRecordsDataのいずれかです。どのように定義しても、Winformsのバインディングメカニズムを使用して特定のコントロールを基になるデータにバインドするために必要なものがあります。
この種の資料を閲覧するのに最適なサイトは here です。 Martin Fowlerは、さまざまな便利なUIデザインパターンとエンタープライズデザインパターンを収集しました。
繰り返しになりますが、ここで重要なのは、各レイヤーが相互作用する方法を正確に定義するインターフェースの使用です。
私自身のアプリケーション(金属切断機の実行に使用されるCAD/CAMアプリケーション)では、私の構造は次のようになります。
私が読んだUIデザインパターンの最初の良い説明は、Jeremy Millerのブログ Building Your Own CAB でした。一般的なパターン-パッシブビュー、MVPなどについて説明し、C#でそれらを実装する方法のいくつかを説明します。
MugenMvvmToolkit を試すことができます。これにより、WinFormsに「純粋なMVVM」を使用できます。すべてのプラットフォームでバインディングをサポートしているため、すべてのプラットフォームで使用可能なWPFプラットフォームで使用可能なすべてのネイティブバインディング機能(WinFormsを含む)。