2011-10-20 4 views
2

J'essaie de travailler avec une grille de données en utilisant le modèle MVVM. Le problème est que chaque fois que je modifie la propriété VM qui est liée à SelectedItem à null, la vue ne désélectionne pas l'élément actuellement sélectionné. Ceci est mon obligatoire dans tous XAML:WPF Datagrid selecteditem = null dans MVVM

<DataGrid Grid.Column="0" Grid.Row="0" 
    ItemsSource="{Binding Path=Users}" 
    AutoGenerateColumns="False" 
    CanUserAddRows="False" 
    IsReadOnly="True" 
    SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay}"> 

Les travaux de liaison SelectedItem de la vue à la machine virtuelle ainsi dans la propriété SelectedUser je l'ai toujours l'objet sélectionné. Le problème est que dans la machine virtuelle, je fais des choses qui modifient parfois la propriété SelectedUser à zéro, donc je m'attendrais à ce que la grille de données désélectionne également la ligne. Au lieu de cela, il reste sélectionné et si j'essaie de cliquer sur la même ligne, la propriété ne se met pas à jour. Si je clique sur une autre ligne, la propriété change comme prévu.

Existe-t-il un moyen de désélectionner le DataGrid si sa propriété binded est définie sur null? Aussi, je suis à la recherche d'une solution MVVM car je ne veux pas écrire de code derrière. Je peux résoudre ce problème en écrivant le code derrière alors ne perdez pas de temps offrir de telles solutions :)

l.e .: c'est ma propriété dans la machine virtuelle:

public RPLUser SelectedUser 
     { 
      get 
      {     
       return selectedUser; 
      } 
      set 
      { 
       selectedUser = value; 
       OnPropertyChanged("SelectedUser"); 
      } 
     } 

Merci à l'avance!

+1

Lorsque vous définissez la propriété dans votre modèle, appelez-vous l'événement OnPropertyChanged pour indiquer à la vue qu'elle doit être mise à jour? – Purplegoldfish

+0

Oui, je suis en train de modifier la description pour le mentionner également. Bonne question, merci! –

+0

Pouvez-vous publier le code que vous utilisez pour définir la propriété dans votre machine virtuelle et également le code de la propriété elle-même? – Purplegoldfish

Répondre

5

Je recommande de vérifier le Output Window en studio visuel et voir si Binding échoue.

Etes-vous sûr que lorsque vous sélectionnez quelque chose, la sélection est mise à jour dans la propriété SelectedUser?

Avez-vous mis un point d'arrêt dans setter de SelectedUser et voyez-vous qu'il est en train de frapper lorsque vous sélectionnez quelque chose sur la grille de données?

Les raisons de cette Binding briser pourrait être beaucoup ...

  1. SelectedUser est de type différent que personne Users.
  2. SelectedUser ne correspond pas par référence à aucun élément dans Users.
  3. Comment et où définissez-vous null?

Le code suivant dans mon cas fonctionne parfaitement bien ...

<tk:DataGrid MaxHeight="200" AutoGenerateColumns="False" 
       ItemsSource="{Binding}" 
       SelectedItem="{Binding MySelItem, 
             ElementName=MyDGSampleWindow, 
             Mode=TwoWay}" 
       IsReadOnly="True"> 
     <tk:DataGrid.Columns> 
      <tk:DataGridTextColumn Header="Key" 
            Binding="{Binding Key, 
                Mode=OneWay}"/> 
      <tk:DataGridTextColumn Header="Value" 
            Binding="{Binding Value, 
                Mode=OneWay}"/> 
     </tk:DataGrid.Columns> 
    </tk:DataGrid> 

Quand je mets MyDGSampleWindow.MySelItem comme nul, le DataGrid déselectionne propertly. Peut-être que vous pourriez avoir besoin de nous donner plus d'informations sur comment vous définissez réellement la valeur comme nulle.

+0

Vous avez raison, je ne mettais pas la propriété à null comme je devrais l'avoir.Je créais un nouvel objet au lieu de le mettre à null. Résolu en définissant d'abord la propriété à null et en lui donnant un nouvel objet. Je vous remercie! –

2

Ouais peut-être besoin d'ajouter le XAML UpdateSourceTrigger pour mettre à jour l'interface utilisateur.

SelectedItem="{Binding SomeProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
+0

Cela ne résout pas le problème, désolé. –

4

Avez-vous essayez de définir IsSynchronizedWithCurrentItem="True" dans les propriétés de XAML pour le DataGrid? AFAIK, cela vous permettra de le désélectionner en définissant le SelectedUser à null.
je ne peux pas tester pour le moment, mais vous pouvez également essayer d'ajouter ceci dans le poseur de votre propriété:

set 
{ 
    selectedUser = value; 
    OnPropertyChanged("SelectedUser"); 

    ICollectionView collectionView = CollectionViewSource.GetDefaultView(Users); 
    collectionView.MoveCurrentTo(selectedUser); 

} 

(Pour ICollectionView à tout faire, vous aurez besoin d'avoir IsSynchronizedWithCurrentItem set)
Comme J'ai dit, je ne peux pas tester cela maintenant. En outre, le setter de la propriété n'est probablement pas le meilleur endroit pour le mettre. Peut-être créer un gestionnaire d'événements pour l'événement PropertyChanged localement et mettre cette logique là.

Laissez-moi savoir si ça aide, sinon je vais voir si je peux courir un court test ...

+0

J'ai eu un problème similaire et le réglage 'IsSynchronizedWithCurrentItem =" True "' travaillé pour moi !! – Satfactor

0

Le DataGrid ne sera pas Désélectionnez automatiquement IsSelected propriété de DataGridRow doit être réglé sur False.

Vous pouvez le faire en définissant un style sur DataGrid .. comme

<Style x:Key="dataGridRowStyle" 
      BasedOn="{StaticResource {x:Type WPFToolkit:DataGridRow}}" 
      TargetType="{x:Type WPFToolkit:DataGridRow}"> 
     <Setter Property="IsSelected" Value="{Binding Path=IsSelected}" /> 
    </Style> 

La propriété IsSelected devrait être de l'objet-à-dire dans votre cas RPLUser devrait avoir une propriété isSelected

Alors avant définissez le SelectedUser sur null ...il suffit de faire SelectedUser.IsSelected=False

Et ne pas oublier de joindre ce style à la DataGridRowStyle dans Datagrid

J'utilise WPFToolkit vous pouvez modifier le style si vous ciblez .NET 4.0

+0

vous pouvez supprimer le BasedOn 'BasedOn =" {StaticResource {x: Type WPFToolkit: DataGridRow}} "' – Ankesh

+0

Cela ne semble pas être un problème de désagrégation de la ligne de données. Je viens de le vérifier, et dans la configuration de base, le DataGrid désélectionne quand l'élément sélectionné est défini sur null via Binding. –

+0

@AngelWPF j'ai essayé de le faire tat moyen, mais il ne fonctionnait pas, donc je l'ai essayé la manière Style – Ankesh

Questions connexes