2016-12-07 2 views
0

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

Répondre

1

Vous devez mettre en œuvre INotifyPropertyChanged dans la classe ItemAuditInstance et mis UpdateSourceTrigger à PropertyChanged dans la liaison cellulaire (comme vous avez dans la liaison de ds_actual_quantity) pour un tel comportement. Dans votre exemple, la liaison de la quantité réelle est définie correctement, mais sans INotifyPropertyChanged, elle peut parfois ne pas fonctionner correctement. Je suggère d'utiliser des champs privés soutenant pour permettre des changements silencieux (parfois nécessaires pour éviter des boucles infinies)

Votre mise en œuvre de INotifyPropertyChanged devrait ressembler à:

public event PropertyChangedEventHandler PropertyChanged; 
public void OnPropertyChanged(PropertyChangedEventArgs e) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, e); 
    } 
} 
private int _difference; 
public int Difference 
{ 
    get 
    { 
     return _difference; 
    } 
    set 
    { 
     _difference = value; 
     OnPropertyChanged(new PropertyChangedEventArgs("Difference")); 
    } 
} 

avec XAML:

<DataGridTextColumn Binding="{Binding Difference, UpdateSourceTrigger=PropertyChanged}" Header="Difference" IsReadOnly="True" Width="*"/> 

maintenant il suffit de régler Différence = current_quantity - actual_quantity et la reliure devrait être mise à jour automatiquement

+0

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

+0

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

+0

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