2016-12-12 6 views
0

データグリッドは、異なるタイプのアイテムのリストを含むクラスにバインドされています。
DataGrid1の項目を選択すると、選択した項目のリストがdatagrid2に表示されます。他のデータグリッドで選択されたアイテムのプロパティにデータグリッドをバインドします。

これを行う簡単な方法はありますか?
これまでのところ、私はSelectedItemsCollection.CollectionChangedイベントハンドラでそれをやろうとしていましたが、データバインディング(xamlまたはViewModelのプログラムで)を介して行う方法があるようです。

+0

データコンテキストに2つのリストがありますか、またはdatagrid1がそのサブオブジェクトの独自のリストを持つようにバインドされているオブジェクトはありますか? – Bryan

+0

@Bryanこれは、 "... datagrid1がサブオブジェクトの独自のリストを持つようにバインドされているオブジェクトですか?" – Number8

答えて

0

あなたがCollectionViewSourceを使用している場合、あなたはリストビュー

<DockPanel > 
    <DockPanel.Resources> 
     <CollectionViewSource x:Key="cvs" Source="{Binding ItemCollection}" /> 
    </DockPanel.Resources> 
    <TextBox Text="{Binding Path=/field1,Mode=OneWay, Source={StaticResource cvs}}" DockPanel.Dock="Bottom"/> 
    <ListView ItemsSource="{Binding Mode=OneWay, Source={StaticResource cvs}}" IsSynchronizedWithCurrentItem="True"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn DisplayMemberBinding="{Binding field1}" Header="Feild1"/> 
       <GridViewColumn DisplayMemberBinding="{Binding field2}" Header="Field2"/> 
       <GridViewColumn DisplayMemberBinding="{Binding field3}" Header="Field3"/> 
       <GridViewColumn DisplayMemberBinding="{Binding field4}" Header="Field4"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</DockPanel> 

を使用して(「\」演算子を使用して)CurrentItemプロパティとIsSynchronizedWithCurrentItem="True"

例に特異的に結合することができます。これは、高度なロックを解除する効果があります並べ替え、グループ化、フィルタリング機能

1

最初のDataGridのSelectedItemプロパティをビューモデルのソースプロパティにバインドします。

<DataGrid x:Name="dataGrid1" SelectedItem="{Binding MySelectedItem}" /> 

private YourType _selectedItem; 
public YourType MySelectedItem 
{ 
    get { return _selectedItem;; } 
    set { _selectedItem; = value; NotifyPropertyChanged(); } 
} 

...と、最初の1で選択されたアイテムのサブプロパティへの第二のDataGridのItemsSourceプロパティ:

<DataGrid x:Name="dataGrid2" ItemsSource="{Binding MySelectedItem.TheCollectionProperty}" /> 

は、あなたのビューモデルクラスはINotifyPropertyChangedの実装していることを確認し、 "MySelectedItem"ソースプロパティが設定されているときにPropertyChangedイベントが発生します。https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

MVVMデザインパターンを使用してこれを行う方法です。

また、このような最初の1のSelectedItemプロパティに直接第二のDataGridのItemsSourceプロパティをバインドできます。このサンプルコードの最初にあなたのアイテムの種類を動作させること

<DataGrid x:Name="dataGrid2" ItemsSource="{Binding SelectedItem.TheCollectionProperty, ElementName=dataGrid1}" /> 

注意を上記のサンプルコードで "YourType"というDataGridには、2番目のDataGridに表示するアイテムのIEnumerableを返す "TheCollectionProperty"というパブリックプロパティが必要です。

+0

ViewModelでViewデータを処理すると、MVVMが破損するため、ビジネスロジック用にViewModelで選択した項目が必要な場合を除いて、選択した項目をViewからViewModelに渡すだけで、表示できるようにする必要がありますViewオブジェクトに直接バインドされる – MikeT

+0

ItemsControlのSelectedItemプロパティをビューモデルのソースプロパティにバインドすると、MVVMパターンはまったく損なわれません。ビューモデルはアプリケーションロジックを担当します(ただし、ビジネスロジック)をMVVMアプリケーションに組み込みます。 – mm8

+0

要素に直接バインドする場合、NotifyPropertyChangedコールは不要です – Bryan

関連する問題