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