13

大規模なアプリケーションの MVVM を説明する優れたチュートリアルを知っている人がいるかどうか疑問に思っていました。私が見つけた MVVM に関するすべてのチュートリアルは基本的な説明 (モデル、ビューモデル、およびビューの実装方法) にすぎませんが、アプリケーション ページ間でデータを渡す場合、ビューモデルを初期化する場所、共通のアプリケーションを保存する場所に関するテクニックとパターンに興味があります。データ (複数のビューモデル間で共有) など

私は、MVVM フレームワーク (MVVMLight など) を使用しない純粋な c#/XAML ソリューションを好みます。

4

3 に答える 3

11

アプリケーションページ間でデータを渡す際のテクニックとパターン

データの受け渡しがイベント ドリブンの場合 (つまり、サーバーからプッシュされたデータを受信したときに通知したい場合)、弱いイベントを使用します。Prism の EventAggregator は、多くの実装の 1 つです。

データの受け渡しが一定である場合は、DataContext を XAML ツリーに流し、単純にバインドを使用します。
つまり、他のより具体的な UserControls を使用する「マスター」UserControl がある場合、それらの DataContext を設定しないでください。それらはマスターのものを継承し、すべて問題ありません。
機能を分離したい場合は、マスターのビューモデルで合成を使用してください。

ビューモデルを開始する場所

純粋主義者は、XAML で直接インスタンス化するように指示します。私はほとんどそれをしません。
まず第一に、ViewModels は通常サービスを必要とし、それらはコンストラクター パラメーターとして渡されるか、コンストラクターで MEF を介して注入されます。

今、私たちは難しいことをすることができますが、何の利益がありますか? ビューのコード ビハインドで ViewModel を取得したり、コンストラクターに挿入したりすることはまったく問題ありません。

共通のアプリケーション データを格納する場所 (複数のビューモデル間で共有)

データがグローバルの場合: 静的クラス/プロパティを使用
します。XAML では、 を介してアクセスできます{x:Static my:StaticClass.StaticProperty}。入れ子になったクラス/列挙型に到達する場合は、+代わりに使用します.

データがすべてではなく複数の ViewModel 間でのみ共有される場合は、ビューモデルで継承/構成をコントローラー パターンと共に使用します。

経験から集めたその他のヒント:

  • 必要なものだけを厳密にバインドします。文字列だけが必要な場合は、オブジェクト全体にバインドしないでください。

  • Binding同じものを何度もバインドする場合は、 /から継承してカスタム マークアップを作成することを躊躇しないでくださいMultiBinding。これは DRY 101 ですが、ほとんどの人は何らかの理由でバインディングをコピーして貼り付けるだけです。

例:

public class VisibilityBinding : MultiBinding, IMultiValueConverter
{
   public VisibilityBinding()
   {
      var isSomething = new Binding("IsSomething");
      isSomething.ElementName = myUsrCtrl;
      this.Bindings.Add(isSomething);

      //Add more bindings

      this.Converter = this;
    }

    //Implement IMultiValueConverter to compute a System.Visibility from the bound values.
}

XAML では次のようになります。

 <TextBox Visibility={customMrkup:VisibilityBinding} />
  • DALに至るまで、データの重複は絶対に避けてください。I(Multi)ValueConverter を介して推測できるフィールドを同期すると、非常に複雑になります。
    例:音声ファイルがあります。開始時刻、終了時刻、および期間があります。これら 3 つのプロパティのいずれかを取り除くと、3 番目のプロパティが推測できます。

他にもヒントを思いついたら、戻ってきて追加します。

お役に立てれば!

于 2012-09-14T11:36:38.387 に答える
2

次の本をご覧になることをお勧めします: Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern ( Amazon.com など)。

5 分間のコード スニペットだけでなく、より一般的なコンテキストで MVVM にアプローチし、ビジネス ソリューションを構成する方法についても提案します。

仕事でよく参考にさせていただきました。個人的には、もう少し内容を掘り下げてほしかったです。それでも、基幹業務アプリケーションの観点から MVVM を理解するには、この記事を読むとよいでしょう。

説明テキスト:

MVVM 設計パターンを使用して、豊富で柔軟で保守可能な基幹業務アプリケーションを作成する

MVVM パターンを Windows Presentation Foundation (WPF) および Microsoft® Silverlight® 4 に適用することで、ビジネス アプリケーションの開発を簡素化および改善します。このハンズオン ガイドでは、MVVM をデータ バインディング、コマンド、および動作と共に使用して、ユーザー インターフェイスを大まかに作成します。ビジネスロジックに結合されます。MVVM は、エンタープライズ アプリケーションの構築経験の有無にかかわらず、WPF と Silverlight を使用する .NET 開発者にとって理想的です。

次の方法をご覧ください。

  • MVVM を深く掘り下げ、他の UI デザイン パターンとの違いを学びます。独自のプロジェクトに適応できるシンプルな顧客関係管理アプリケーションを構築します。
  • MVVM を実装して、UI 宣言構文とプレゼンテーション ロジック コードの分離を維持する
  • ドメイン モデルを作成してアプリケーションのビジネス コンテキストを定義する
  • Microsoft Entity Framework と NHibernate を使用してデータ アクセス レイヤーの動的コードを作成する
  • Windows Workflow Foundation 4 を使用して複雑なデータ検証シナリオを適用する
  • Microsoft Prism などのフレームワークとツールキットを使用して MVVM を実装する
于 2012-09-14T11:22:45.720 に答える
1

まず、すべての ViewModel に共通するいくつかのプロパティを持つ BaseViewModel を作成できます。Castle / Prism4のような依存性注入を使用して、あるビューモデルから別のビューモデルにデータを送信します。Prisms EventAggregator を使用ました。これがあなたの探求に役立つことを願っています。しかし、Jon が言ったように、何を使用するかは完全にあなた次第です。しかし、これらは良い出発点です。

于 2012-09-14T11:10:09.667 に答える