2017-04-17 7 views
-3

OrderViewModelクラスにObservableCollection<Car>を作成しているとします。 私もCarUserControl.xamlファイルを持っています。WPFバインディングを上書きするコードで行われた変更

this.DataContext = new CarViewModel();

それはOrderViewModelクラスからCarUserControlののDataContextを設定することは可能です:クラス(CarUserControl.xaml.cs)の後ろに対応するコードでは、私はラインを持っていますか?

編集:これは以前の質問の修正版です。

+0

関連するXAMLコードを投稿できますか? – MrZander

+0

CarViewModelの関連部分を投稿できますか? –

+1

あなたが仮定しているメカニズムは間違っています。それはあなたがそれを与えているインスタンスを置き換えるものではありません。明示的に別のインスタンスの 'Car'をどこかに与えているか、バインディングを間違っているためUIに何も表示されません。問題を再現するのに十分なコードを表示し、それを表示します。ちなみに、*あなた*はデフォルトのコンストラクタを呼び出しています。 –

答えて

2

私はあなたがまた、同様にあなたにXAMLファイルをインスタンス化しているCarUserControl.xaml.cs

で、CarViewModelのデフォルトコンストラクタを使用していますインスタンスは1つのみです。

<UserControl.DataContext> 
    <local:CarViewModel/> 
</UserControl.DataContext> 

あなたはあなたのコード内の任意の場所にObservableCollection<CarViewModel> listではなく、あなたが作成した新しいインスタンスにバインドされていません。

バインディングメカニズムが作成したインスタンスを使用していないことがわかりました。むしろCarViewModelのデフォルトのコンストラクタを使用しています。

"作成したばかりのインスタンスを使用していない"場合は、ObservableCollectionのインスタンスを参照してください。それがあなたがしようとしているものなら、コレクションにバインドする必要があります。私はあなたのObservableCollection<CarViewModel> listがどこにあるのか分からないが、CarUserControlDataContextがこのリストを参照する必要がある。

PS:コードでは、実際に何をしようとしているかは記述されていません。

+0

申し訳ありませんが、これは私が持っているコードの最小化バージョンです。私の 'ObservableCollection list'は' ItemsSource = "{Binding list}"を介してItemCollectionにバインドされています。 – Max

+0

私はOrderViewModelクラスから 'CarViewModel'(実際の値付き)のリストを作成したが、CarUserControlのDataContextをCarViewModelの新しいインスタンスに設定していることが問題だと思います。 – Max

+1

'ObservableCollection list'が' ItemsSource = "{Binding list}"を介してItemCollectionにバインドされている場合、CarUserControlでDataContextを設定する必要はありません。 – Bubba

0

変更した質問に答えるために:

がOrderViewModelクラスからCarUserControlののDataContextを設定することが可能ですか?

いいえ、MVVMの原則に違反することはありません。 MVVMの主な目的の1つは、懸念の分離を達成することです。ビューモデルはビューのデータを保持し変換しますが、ビューモデルはビューについて何も知らないはずです。ビューが存在するかどうかは分かりません。したがって、ビューへの参照を持たず、ビューのデータコンテキストを設定することもできません。

このようにしたい理由が指定されていないため、解決策を提供することは難しいです。あなたが新しい質問を作成する場合、いくつかの指針を与えることができます。

+0

私が持っていた問題は、CarViewModelの2つの異なるインスタンスをバインドしていて、予期しない動作が発生していたことです。私はOrderViewModelクラスからDataContextを設定したかったので、CarUserControlからバインドする必要はありません。しかし、努力していただきありがとうございます! – Max

関連する問題