2016-03-31 4 views
2

MVVM Light WPFアプリケーションでEntity Framework 6を​​使用しています。私はこのアプリのDbContextMainWindow.xamlからユーザコントロールのビューモデルに渡したいと思います。XAML経由でユーザーコントロールのVMにDBコンテキストを渡す

ユーザーコントロールのビューモデルがSearchEmployeeViewModel.csで、次のコンストラクタを持っています

public SearchEmployeeViewModel(MyEntities context) 
{ 
    Context = context; 

    // Other code... 
}  

MainWindow.xamlはこれを使用してユーザーコントロールを宣言し、それは私の知る限り、私の試みに行くことができるようだ:

<usercontrol:SearchEmployeeControl> 
    <ObjectDataProvider ObjectType="{x:Type data:MyEntities}"> 
     <ObjectDataProvider.ConstructorParameters> 
      <data:MyEntities > 

      </data:MyEntities> 
     </ObjectDataProvider.ConstructorParameters> 
    </ObjectDataProvider> 
</usercontrol:SearchEmployeeControl> 

このアプリケーションのDbContextは、MainViewModel.csコンストラクタで次のようにインスタンス化されます。

_context = new MyEntities(); 

このEF DbContextを経由でSearchEmployeeViewModel.csコンストラクタに渡すにはどうすればよいですか?私はこれに似た何かをしようとしているが、全体のデータコンテキストオブジェクトを渡している:Where to create parametrized ViewModel?

更新:私は、ユーザーコントロールにEF DbContextに合格しようとしています。

+1

コンストラクタ内の他のコードが初期化されたコンテキスト –

+0

を使用していない限り、ありがとう、@ GordonAllocman。私はその答えに気付かなかった! – Alex

+0

@GordonAllocmanの構文は何でしょうか? MainWindow.xamlでは、私はこれをユーザコントロール宣言の内部に持っています: ''。 'Context'プロパティを何かに束縛することはできません。だから私はどのようにデータオブジェクトを渡すのですか? – Alex

答えて

7

このMVVMタグが付いているので、この回答はMVVMの使用に基づいています。

ビューは、オブジェクトを作成したり、値を割り当てたりしないでください。これは、ユーザーが対話するために使用できるViewModel/Modelsのユーザーフレンドリーな表現であることを意味します。

は何あなたが今持っていることのように見える:

  • AppStartupはEF dbContextを作成し、View.DataContextに割り当て
  • ビューはViewModelにを作成し、それをEF dbContext
を渡そう

ビューはオブジェクトの作成やこのような値の割り当てを行うべきではないので、これは間違っています。あなたはMVVMのために何をしたいです

  • あるAppStartup
    • のViewModelとEF dbContext
    • のViewModel
    • にdbContextセットはビューを作成し、表示するビューモデルを割り当て作成します。DataContextの
  • ビューは、ユーザーにビューモデルを表示し、それらを

だから、あなたが持っているべきか、それとの対話、このようなものであることを可能にする:

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    var app = new MainWindow(); 
    var dbContext = new MyEntities(); 
    var context = new MyViewModel(dbContext); 

    app.DataContext = context; 
    app.Show(); 
} 

AppStartupは、あらゆる種類のアプリケーションのために責任がありますEF DataContextまたはViewModelの作成などの初期化。ビューから

、あなたは

<DataTemplate DataType="{x:Type local:SearchEmployeeViewModel}"> 
    <userControl:SearchEmployeeControl /> 
</DataTemplate> 

ようなものを書くことができ、これはSearchEmployeeControlを使用して、それを描く、

いつでもあなたはVisualTreeタイプSearchEmployeeViewModelのオブジェクトに遭遇WPFを伝える、と設定されますその制御のDataContextSearchEmployeeViewModelになります。あなたはより多くの学習に興味がある、または私は非常にお勧めしたい場合

<ContentControl Content="{Binding SearchEmployeeViewModel}" /> 

<TabControl Content="{Binding TabViewModels}" /> 

私もSimple MVVM Example on my blogを持っている:通常のviewmodelsは、このように、ContentまたはItemsSourceプロパティを使用してUIに挿入されている

WPFの初心者でありながら、DataContextの内容や動作方法を十分に理解していない場合は、What is this "DataContext" you speak of?を読んでください。

あなたがあなたの疑問に持っているとして、あなたのビューは、ビューモデルの値を割り当てる持っていると思った場合、あなたのオプションはどちらか

  • が表示
  • 背後にあるコードを経由してプロパティを割り当てている、と述べた

  • ViewModel.ContextをDependencyPropertyに変更し、OneWayToSourceバインディングモードを使用してバインドします。つまり、バインディングは、ビューからViewModelに値を転送することによってのみ機能します。

私はこれらのどちらもお勧めしませんし、むしろこれをMVVMで適切に行うように再設計したいと思いますが、私が1つを選ぶことを余儀なくされたら、コードを使用することを選択します。あなたはすでにこの時点で一連のルールを破っているので、もう一度どうしたらいいですか?

+0

ありがとう、@レイチェル。 WPFルームでチャットしても大丈夫ですか? https://chat.stackoverflow.com/rooms/18165/wpf – Alex

+2

@Alex私は大好きですが、それは私のオフィスからブロックされているので、別の日でなければなりません。明日私にpingをしてもらえますか、ご質問がある場合は、コメントに投稿してください:) – Rachel

+2

@Rachel新しいオフィスが必要なように聞こえます。

0

あなたはこのような何かをしたい:

<usercontrol:SearchEmployeeControl> 
    <usercontrol:SearchEmployeeControl.DataContext> 
     <viewModel:SearchEmployeeViewModel> 
      <ViewModel:SearchEmployeeViewModel Context={Binding RelativeSource={RelativeSource AncestorType={x:Type Window}} /> 
     </viewModel:SearchEmployeeViewModel> 
    </usercontrol:SearchEmployeeControl.DataContext> 
</usercontrol:SearchEmployeeControl> 

重要な事はAncestorType={x:Type Window}は、あなたのビューがあるものは何でもする必要があり、注意すること(すなわちウィンドウ、ページ、等。)。

あなたのviewmodelの宣言も単一のタグでなければなりません。開始タグと終了タグがある場合は、セッターを使用する必要がありますが、テストしなかったと思います。

+0

この場合、 'Context'は' SearchEmployeeViewModelを参照しています。Context'プロパティは依存関係プロパティではなく、データバインディングを受け付けません。これは機能しません。私はOPがWPF/MVVMを使用しているときに一般的に推奨されていないXAMLを介してそのプロパティを初期化しようとしていると信じています – Rachel

+0

これはおそらく良いmvvmの練習ではないと同意しますが、Contextがプロパティかどうか彼が私たちに与えたコードだけです。私はこれを自分のコードの一部のビューモデルで試してみました。このようなプロパティを設定することができました。私の答えは、正確にどのOPがDataContextをviewmodelに送信するのか尋ねました –

+0

私はEF DbContextを子のユーザコントロールに渡そうとしています。上記の私の更新を見てください。ありがとう。 – Alex

関連する問題