2016-07-05 6 views
0

私はWPF MVVM Appを持っていますが、ViewModelを汎用的にしたいと思います。アプリケーションが行うと思われることは、コンパイル時に取得しているデータの種類を知らなくても、データを取り込んでCRUD操作を行うことです。だから私はこのように私のViewModelを宣言:汎用ViewModelの使用

public class GenericViewModel<T> where T : class 
{ 

    private void ConstructorBase() 
    { 
     Type theType = typeof(T); 
     Properties = theType.GetProperties().ToList(); 
    } 

    public GenericViewModel(DbContext _dbContextInsert) //pravi novi repository na osnovu DbContexta 
    { 
     ConstructorBase(); 
     _R = new RepositoryGlobal<T>(_dbContextInsert); 
    } 


    public T newT { get; set; } 
    public T selectedT { get; set; } 
    public List<PropertyInfo> Properties { get; set; } 
    private RepositoryGlobal<T> _R; 

} 

さて、あなたはそれの内部を見る無視のほとんどすべてが、唯一重要なことは、コンストラクタに達したことはありませんということです。私はこのようなメインウィンドウのためのDataContextとして、このビューモデルを設定します。

InitializeComponent(); 
this.DataContext = new GenericViewModel<Person>(new PersonDbContext()); 

しかし、私はViewModelにのコンストラクタ内のブレークポイントを入れたときに、プログラムが停止れることは決してありません。 アイデア

+0

GenericViewModelまたはPersonDbContextのPersonDbContextコンストラクタまたは静的フィールドがクラッシュしてクラスを破損している可能性があります。 – nkoniishvt

+0

少なくともブレークポイントに当たらない理由はありません。あなたはthis.DataContextにブレークポイントを置こうとしました= ...そしてステップスルー? – sondergard

+0

InitializeComponentでブレークポイントを設定するとどうなりますか?どのようなプラグインも有効です(例えば、DIコンテナ用)?たぶんあなたは別のctorを使用しています。 –

答えて

1

依存関係は、実装ではなく抽象である必要があります。

あなたの一般的なビューモデルは、それ自身のリポジトリを作成して、代わりにあなたはコンストラクタを介してこの依存のインスタンスを渡す必要がありません必要があります。

public class GenericViewModel<T> where T : class 
{ 
    protected readonly IRepository<T> _Repository; 

    public GenericViewModel(IRepository<T> repository) 
    { 
     _Repository = repository; 
    } 

    ... 
} 

あなたがそのようにのようなあなたのリポジトリのインスタンスを作成します。

あり
DbContext context = new PersonDbContext(); 
IRepository<Person> personRepo = new PersonRepository(context); 
GenericViewModel<Person> personViewModel = new GenericViewModel<Person>(personRepo); 

、あなたのビューモデルの依存関係はもはや特定の実装に関連付けられている、あなたのコードは今はるかに適応変化にではありません。大量にテストするのは簡単ではありません。

+1

ええ、私は「ViewModelの中身は無視してください」と言いました。問題は、MainWindowのDataContextとして設定しても、ViewModelがインスタンス化されないことです。 入力いただきありがとうございますが、それでも私の問題は解決しません。 –

関連する問題