2016-12-12 2 views
0

J'ai une grille de données liée à une classe qui contient une liste d'un type différent d'éléments.
Lorsqu'un élément dans datagrid1 est sélectionné, la liste de l'élément sélectionné doit être affichée dans datagrid2.Lier la grille de données à la propriété de l'élément sélectionné dans une autre grille de données

Existe-t-il un moyen simple de le faire?
Jusqu'à présent, j'ai essayé de le faire dans le gestionnaire d'événements SelectedItemsCollection.CollectionChanged, mais il me semble qu'il pourrait y avoir un moyen de le faire via la liaison de données (soit dans xaml soit par programmation dans le ViewModel).

+0

Est-ce que votre contexte de données a la liste 2, ou l'objet que datagrid1 est lié à avoir sa propre liste de ses sous-objets? – Bryan

+0

@Bryan Celui-ci: "... l'objet que datagrid1 est lié à avoir sa propre liste de ses sous-objets?" – Number8

Répondre

0

Si vous utilisez un CollectionViewSource alors vous pouvez lier à la propriété CurrentItem (en utilisant l'opérateur « \ ») et IsSynchronizedWithCurrentItem="True"

Exemple d'utilisation ListView

<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> 

Cela a aussi pour effet de déverrouiller la pointe trier, regrouper et filtrer les fonctions

1

Lier la propriété SelectedItem du premier DataGrid à une propriété source de votre modèle de vue:

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

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

... et la propriété ItemsSource du deuxième DataGrid à la propriété sous de l'élément sélectionné dans la première:

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

Assurez-vous que votre point de vue classe modèle implémente le INotifyPropertyChanged et déclenche l'événement PropertyChanged lorsque la propriété source "MySelectedItem" est définie: https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

Pour ce faire, utilisez le modèle de conception MVVM.

Vous pouvez également lier la propriété ItemsSource du second DataGrid directement à la propriété SelectedItem du premier comme ceci:

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

Notez que pour cet exemple de code pour travailler le type de vos articles dans la première DataGrid, à savoir "YourType" dans l'exemple de code ci-dessus, doit avoir une propriété publique appelée "TheCollectionProperty" qui renvoie un IEnumerable des éléments que vous souhaitez afficher dans le second DataGrid.

+0

Obtenir ViewModel pour traiter View Data rompt MVVM, donc à moins qu'il n'ait besoin de l'élément sélectionné dans ViewModel pour la logique métier, vous ne devez pas passer l'élément sélectionné de View à ViewModel juste pour que View puisse le montrer. être lié directement à un objet View – MikeT

+0

La liaison de la propriété SelectedItem d'un ItemsControl à une propriété source d'un modèle de vue ne casse certainement pas le modèle MVVM de quelque manière que ce soit ... le modèle de vue est responsable de la logique de l'application (mais pas la logique métier) dans une application MVVM. – mm8

+0

si vous liez directement à l'élément, l'appel NotifyPropertyChanged n'est pas nécessaire – Bryan