10

包括的な単体テストを可能にするために、WPF アプリケーションで MVVM パターンを使用しています。MVVM パターン自体はうまく機能していますが、WPF の設計時のデータ サポートを使用できるようにパターンを適応させるのに苦労しています。

Prism を使用しているため、ViewModel インスタンスは通常、ビューのコンストラクターに挿入されます。

public MyView(MyViewModel viewModel)
{
    DataContext = viewModel;
}

次に、ViewModel の依存関係がコンストラクターに注入されます。

public class MyViewModel
{
    public MyViewModel(IFoo foo, IBar bar)
    {
        // ...
    }

    // Gets and sets the model represented in the view
    public MyModel { get; set; }

    // Read-only properties that the view data binds to
    public ICollectionView Rows { get; }
    public string Title { get; }

    // Read-write properties are databound to the UI and are used to control logic
    public string Filter { get; set; }
}

これは一般的に、デザイン データの場合を除いて非常にうまく機能しています。デザイン データ固有のクラスをリリース済みのアセンブリにコンパイルすることは避けたかったので、{d:DesignData}アプローチの代わりにアプローチを使用することにしました{d:DesignInstance}が、これが正しく機能するためには、 ViewModel には、パラメーターなしのコンストラクターが必要になりました。さらに、XAML でこれらのプロパティを設定できるようにするために、追加のプロパティを変更してセッターを持たせるか、変更可能なコレクションにする必要があることもよくあります。

public class MyViewModel
{
    public MyViewModel()
    {
    }

    public MyViewModel(IFoo foo, IBar bar)
    {
        // ...
    }

    // Gets and sets the model represented in the view
    public MyModel { get; set; }

    // My read-only properties are no longer read-only
    public ObservableCollection<Something> Rows { get; }
    public string Title { get; set; }

    public string Filter { get; set; }
}

これは私を心配しています:

  • 呼び出されることを意図しておらず、単体テストされていないパラメーターなしのコンストラクターがあります
  • ViewModel 自体のみが呼び出す必要があるプロパティのセッターがあります。
  • 私の ViewModel は、ビューによって変更されるべきプロパティと変更されるべきでないプロパティがごちゃまぜに混ざり合ったものになりました。
  • 設計時に特定のプロパティを設定すると (Filterテキストのスタイルを確認するなど)、実際には ViewModel ロジックが呼び出される場合があります。(したがって、私の ViewModel は、そうでなければ必須の依存関係が設計時に欠落していることにも寛容である必要があります)

このように ViewModel を危険にさらさない方法で、WPF MVVM アプリケーションで設計時のデータを取得するより良い方法はありますか?

または、別の場所でロジックが分離されたより単純なプロパティを持つように、ViewModel を別の方法で構築する必要があります。

4

2 に答える 2

-1

私も、WPFとMVVMを実装したNUnitテストに取り組んできました。ただし、私のバージョンはあなたのバージョンとは逆になっています。最初にビューを作成し、次にそれを制御するモデルを作成します。

私のバージョンでは、最初にMVVMモデルを作成し、牛が家に帰るまで単体テストを行うことができ、視覚的なデザインについて心配する必要はありません...モデルが壊れている場合は、視覚的な実装も同様です。

私のMVVMモデルには、「GetTheViewWindow」へのメソッドがあります。したがって、MVVMベースラインから派生する場合、各ビューモデルには独自のビューがあります。したがって、仮想メソッドを介して、各インスタンスは、本番環境に適用されるときに独自の新しいビューウィンドウを実行します。

public class MyMVVMBase
{
   private MyViewBaseline currentView;

   public MyMVVMBase()
   { // no parameters required }

   public virtual void GetTheViewWindow()
   { throw new exception( "You need to define the window to get"; ) }
}

public class MyXYZInstanceModel : MyMVVMBase
{
   public override void GetTheViewWindow()
   {
      currentView = new YourActualViewWindow();
   }
}

これがあなたが遭遇しているものの代替として役立つことを願っています。

于 2013-02-08T18:12:29.357 に答える