2011-07-14 17 views
0

こんにちは、私は私がここにスレッドWPF MVVM Master detail view with a datagrid and a TabControlWPF MVVMアクセス項目

それは、詳細は子ビューとしてマスタとのTabControlなどのデータグリッドで表示マスターであるに尋ねたものを実装しました。グリッドのSelectedItemは、TabControlのItemsSourceにバインドされます。

ViewModelで書かれたCommandでTabControlにバインドされたItemにアクセスするにはどうすればよいですか?基本的には、バインドされたコレクション(子に)に新しいアイテムを追加したいと思います。しかし、バインドされた項目は、DataGridのselectedItemです - どの項目を見つけるか

答えて

1

これは、動作させようとしているコマンドについていくつかの詳細を持っていますが、使用しているコントロールのCommandParameterを同じDataGrid.SelectedItemプロパティにバインドすることができますTabControlのItemsSourceに使用します。 CommandParameterはコマンドハンドラのパラメータとして使用できます(DelegateCommand、RelayCommandなど、使用しているICommand実装によって異なる場合があります)。

+0

このアプローチを提案してくれてありがとう。やってみます。デリゲートコマンドの実装では、ジェネリック型をDataGridにバインドされたオブジェクトにする必要がありますか? – ganeshran

+0

通常、期待しているCommandParameterの型にする必要がありますが、CommandParameterプロパティ自体がオブジェクト型であるため、オブジェクトとして保持し、後でハンドラ内にキャストすることもできます。一部のDC実装では、Bindingが評価されて例外に終わる前に最初のnull値を処理する方法がわからないため、パラメータに値型を使用すると問題が発生します。 –

0

コントロールを直接接続するのではなく、両方のコントロールがバインドされている、ある種のプロキシプロパティをビューモデルに導入しないでください。そのうちの1人はMode = TwoWayです。

+0

私は既にマスタービューの選択したアイテムに子ビューをバインドしました。これはプロキシプロパティを導入しなければできないのですか? – ganeshran

0

CollectionViewSource.GetDefaultView()を使用すると、TabControlがバインドされているICollectionViewを返すことができます。 TabControlでIsSynchronizedWithCurrentItemをtrueに設定すると、ICollectionViewのCurrentプロパティはコマンドに渡すことができます。

0

SelectedMauseというViewModelのプロパティが必要です。 DataGridのSelectedItemプロパティをこのSelectedCauseプロパティにバインドします。次に、TabControlをSelectedItem.Solutionsにバインドするのではなく、SelectCause.Solutionsにバインドします。あなたが持っている問題のために、この方法で正確に行う方が良いです。現在選択されている原因を表すViewModelのプロパティが必要です。 ViewModelはViewの状態を表現するためのものです。 DataGridの選択された項目はその状態の一部なので、ViewModelにSelectedCauseプロパティが必要です。

関連する問題