2016-12-07 9 views
0

私は以下のコードで在庫を監査しています。 DataGridのactual_quantityセルを編集すると、ItemAuditInstanceインスタンスは自動的に更新され、actual_quantityと設定され、differenceと計算されます。私の問題は、DataGridが自動的actual_quantityのためのセルをリフレッシュしなくdifferenceテーブル全体を更新せずに特定のDataGrid列セル値をリフレッシュする方法

は、私はあなたがDataGridののItemsSourceが戻っリストにnullに設定することで、リフレッシュを強制することができます知っているが、私がいないとして、それは資源の無駄のように思えます1つの値に対して数百の行をリフレッシュしたい。これを行う方法はありますか?

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> 

答えて

1

あなたは(あなたがds_actual_quantityの結合を持っているだけのように)ItemAuditInstanceクラスにINotifyPropertyChangedのを実装し、結合セル内にPropertyChangedにUpdateSourceTriggerを設定する必要がありますそのような行動のために。 あなたの例では、実際の数量のバインディングは正しく設定されていますが、INotifyPropertyChangedを使用しないと正しく動作しないことがあります。 私は(時々無限ループを回避するために必要)サイレント変化

がINotifyPropertyChangedのの実装では、のようになりますできるようにバックアッププライベートフィールドを使用することをお勧め:XAMLとともに

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

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

を設定するだけです 差異=現在の数量 - 実際の数量 とバインディングは自動的に更新されます

+0

こんにちは、ありがとう!しかし、私の謝罪は、私は私の問題をよく説明したとは思わない。それは「差」が更新されていないということではありません。それは、 '差分 'を表すDataGridのセルがリフレッシュされていないことです。私。差分が25になると、セルはまだ0を示します。 – Dilisqq

+0

"UpdateSourceTrigger = PropertyChanged"は、更新を監視するようにセルに指示します。デフォルトでは、UpdateSourceTriggerは "OneTime"に設定されています。これは、ItemsSourceが変更されたとき(コレクション全体)の値を読み取る場合のみです。 PropertyChangedを使用すると、バインディングはプロパティが変更されたことを通知します私の答え(OnProperyChangedメソッドによる)に示されているように、INotifyPropertyChangedインターフェイス - 私は、変更が行われ、その値を更新する必要があることをDataGridに通知する方法を示しました。今すぐに理解してほしいと思っています – Rachey

+0

待って、私はばかだ、申し訳ありません。私は 'ItemAuditInstance'に' InotifyPropertyChanged'を継承しなければならないことは分かりませんでした。一度それをしたら、あなたのコードがうまくいった。どうもありがとうございます! – Dilisqq

関連する問題