包括的な単体テストを可能にするために、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 を別の方法で構築する必要があります。