J'ai donc le code suivant destiné à auditer notre inventaire. Lors de l'édition de la cellule actual_quantity
sur le DataGrid, l'instance ItemAuditInstance
est automatiquement mise à jour, définissant son actual_quantity
ainsi que son calcul pour difference
. Mon problème est le DataGrid actualise automatiquement la cellule pour actual_quantity
mais pas difference
Comment faire pour actualiser la valeur de cellule-cellule DataGrid spécifique sans actualiser la table entière
Je sais que vous pouvez forcer un rafraîchissement en définissant ItemsSource de DataGrid à null puis revenir à la liste, mais il semble comme un gaspillage de ressources que je ne vouloir actualiser des centaines de lignes pour une seule valeur. Y a-t-il un moyen de le faire?
ItemAuditInstance:
public class ItemAuditInstance : ReflectionObject {
public int id { get; set; }
public int bfk_item_audit_id { get; set; }
public string item { get; set; }
public int current_quantity { get; set; }
public int actual_quantity { get; set; }
public int difference { get; set; }
public int ds_actual_quantity {
get {
return actual_quantity;
}
set {
actual_quantity = value;
difference = current_quantity - actual_quantity;
}
}
XAML:
<DataGrid x:Name="dgItems" Margin="0,0,0,50" AutoGenerateColumns="False" HorizontalContentAlignment="Right" RowEditEnding="dgItems_RowEditEnding">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding item}" Header="Item" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding current_quantity}" Header="Current Quantity" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding ds_actual_quantity, UpdateSourceTrigger=PropertyChanged}" Header="Actual Quantity" IsReadOnly="False"/>
<DataGridTextColumn Binding="{Binding difference}" Header="Difference" IsReadOnly="True" Width="*"/>
</DataGrid.Columns>
</DataGrid>
Salut, merci pour ça! Mes excuses cependant, je ne pense pas que j'ai bien expliqué mon problème. Ce n'est pas que la 'différence 'ne soit pas mise à jour - elle l'est. C'est que la cellule sur le DataGrid représentant «différence» n'est pas rafraîchissante. C'est à dire. lorsque la différence devient 25, la cellule affiche toujours 0. – Dilisqq
Le "UpdateSourceTrigger = PropertyChanged" est chargé de dire à la cellule de surveiller les mises à jour. Par défaut, UpdateSourceTrigger est défini sur "OneTime", qui lit uniquement la valeur dans un cas - lorsque la source ItemsSource est modifiée (la collection entière) Avec PropertyChanged, la liaison attend le signal que la propriété a été modifiée. Elle est donnée par l'interface INotifyPropertyChanged comme indiqué dans ma réponse (par la méthode OnProperyChanged) - Je vous ai montré le moyen de notifier votre grille de données qu'une modification est survenue et qu'elle devrait mettre à jour ses valeurs. J'espère que c'est plus facile à comprendre maintenant – Rachey
Attends, je suis bête, désolé. Je n'ai pas réalisé que je devais hériter de 'INotifyPropertyChanged' dans' ItemAuditInstance'. Une fois que j'ai fait cela, votre code a fonctionné. Merci beaucoup! – Dilisqq