2016-12-07 4 views
0

So habe ich den folgenden Code, um unser Inventar zu überprüfen. Beim Bearbeiten der Zelle actual_quantity auf dem DataGrid wird die ItemAuditInstance -Instanz automatisch aktualisiert und setzt ihre actual_quantity sowie die Berechnung für ihre difference. Mein Problem ist das Datagrid automatisch die Zelle für actual_quantity erfrischt aber nicht differenceSo aktualisieren Sie bestimmte DataGrid-Spalte-Cell-Wert ohne die gesamte Tabelle zu aktualisieren

Ich weiß, dass Sie eine Aktualisierung erzwingen können durch die Itemssource des Datagrid Einstellung dann zurück in die Liste auf null, aber es scheint wie eine Verschwendung von Ressourcen, da ich nicht tun möchte Hunderte von Zeilen für nur einen Wert aktualisieren. Gibt es einen Weg, dies zu tun?

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> 

Antwort

1

Sie sollten INotifyPropertyChanged in der ItemAuditInstance Klasse implementieren und setzen Sie Update auf Property in der Zellbindung (wie Sie in der Bindung von ds_actual_quantity haben) für ein solches Verhalten. In Ihrem Beispiel ist die Bindung der tatsächlichen Menge richtig eingestellt, aber ohne INotifyPropertyChanged kann es manchmal nicht richtig funktionieren. Ich schlage vor, die Sicherung private Felder mit stillen Änderungen ermöglichen (manchmal benötigt, um Endlosschleifen zu vermeiden)

Ihre Implementierung von INotifyPropertyChanged aussehen sollte:

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")); 
    } 
} 

zusammen mit XAML: Jetzt

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

Setzen Sie einfach Difference = current_quantity - actual_quantity und die Bindung sollte automatisch aktualisiert werden

+0

Hallo, danke dafür! Ich entschuldige mich, ich glaube nicht, dass ich mein Problem gut erklärt habe. Es ist nicht so, dass "Unterschied" nicht aktualisiert wird - es ist. Es ist, dass die Zelle auf dem DataGrid, die "Unterschied" darstellt, nicht auffrischt. I.e. Wenn die Differenz 25 wird, zeigt die Zelle immer noch 0 an. – Dilisqq

+0

Der "UpdateSourceTrigger = PropertyChanged" ist verantwortlich für die Meldung an die Zelle, Updates zu überwachen. Standardmäßig ist UpdateSourceTrigger auf "OneTime" eingestellt, das den Wert nur in einem Fall liest - wenn die ItemsSource geändert wird (die gesamte Auflistung) Mit PropertyChanged wartet die Bindung auf das Signal, dass die Eigenschaft geändert wurde - sie wird durch gegeben Die INotifyPropertyChanged-Schnittstelle, wie in meiner Antwort (mit der OnProperyChanged-Methode) gezeigt - Ich habe Ihnen die Möglichkeit gezeigt, Ihr Datagrid zu benachrichtigen, dass eine Änderung stattgefunden hat, und es sollte seine Werte aktualisieren. Hoffe, es ist jetzt einfacher zu verstehen – Rachey

+0

Warte, ich bin dumm, tut mir leid. Ich wusste nicht, dass ich "INotifyPropertyChanged" in "ItemAuditInstance" erben musste. Sobald ich das getan habe, hat dein Code funktioniert. Ich danke dir sehr! – Dilisqq

Verwandte Themen