Question

J'ai regardé et je ne peux pas tout à fait trouver ce que je cherche. J'ai un environnement MVVM. Sur le modèle d'affichage, j'ai un jeu de données disponible à partir des données d'une connexion / requête de base de données. J'ai exposé une propriété (getter / setter) en tant que "DataView" basé sur "TheTable.DefaultView".

J'ai un DataGrid dans la fenêtre qui se lie au DataView ... pas de problème.

<DataGrid AutoGenerateColumns="False" 
   Name="dataMyData"
   ItemsSource="{Binding Path=ViewModelViewProperty, 
   NotifyOnSourceUpdated=True, 
   NotifyOnTargetUpdated=True}"
   SelectedItem="{Binding Path=JustOneRecordInView, Mode=TwoWay}"
   SelectionMode="Single"
   SelectionUnit="FullRow"
   GridLinesVisibility="Horizontal"
   CanUserDeleteRows="False"
   CanUserAddRows="False" >

pour le "SELECTIONNEMEEM" ci-dessus, il vient également d'une propriété exposée sur la vue de la vue via son (getter / setter).

Maintenant, mon problème. En faisant défiler la liste des enregistrements de la grille de données, j'ai d'autres contrôles de zone de texte pour afficher plus de données que la liste des grilles fournies. Je veux pouvoir modifier les données de "la ligne actuelle", donc j'ai une zone de texte avec autant de paramètres que je peux penser, mais quelque chose est toujours mal.

<TextBox 
   Text="{Binding Path=PropertyForCurrentRecord[SpecificColumnInDataViewRow], 
        Mode=TwoWay, 
        UpdateSourceTrigger=PropertyChanged, 
        ValidatesOnDataErrors=True, 
        ValidatesOnExceptions=True,
        BindsDirectlyToSource=True,
        NotifyOnSourceUpdated=True,
        NotifyOnTargetUpdated=True,
        NotifyOnValidationError=True}"
    Name="textBox1" VerticalAlignment="Top" Width="40" />

Si je fais défiler et je suis en mode édition des données et modifiez la valeur dans la zone de texte associée à la ligne actuelle, et cette valeur est l'une des colonnes affichées dans la grille, le DataGrid lui-même ne montre pas la valeur modifiée. Toutefois, si je continue à faire défiler et retourner sur le même enregistrement, la valeur dans la zone de texte affiche le changement de valeur.

Alors, comment puis-je forcer que la source de données de la grille est considérée comme mise à jour à mesure que la colonne individuelle de la ligne spécifique a changé et la grille elle-même mise à jour également. Merci ...

Était-ce utile?

La solution 2

wow ... Après un tas de plus de creuser à partir des jours précédents, je l'ai enfin craqué et voici comment je l'ai réparé.

private bool AcceptingTheChanges = false;
private DataRowView myRecord;
public DataRowView MyRecord
{
   get { return myRecord; }
   set {
          if (myRecord != null)
                myRecord.Row.Table.AcceptChanges();

          // Now, get the incoming value and re-store into private
          myRecord = value;
          // Finally, raise event that it changed to refresh window...
          RaisePropertyChanged("MyRecord");
       }
}

Autres conseils

Votre DataGrid est lié à une collection de certains éléments de type de type.Pour faire connaître votre tâche, vous devez implémenter inotifyPropertychangned dans le Marrage (ou hériter de ViewModelBase si vous l'avez).Vous pouvez jeter un coup d'oeil à un bon exemple ici: http:// www.hightech.ir/seesharsehars/best-implementation-of-inotifyPropertychange-ever

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top