2016-09-15 6 views
2

Я пытаюсь провести промежуточное подсчет нескольких строк динамически, если CellEditEnding при запуске. Прямо сейчас я перебираю всю коллекцию, чтобы получить общее количество и поместить ее в общую ячейку. Смотрите ниже код:Промежуточные ячейки в строке datagrid wpf

private void CalculateTotals() 
    { 
     foreach (var i in reviewItems) // total pay is calculated on data load 
     { 
      if (i.Total_Pay == null || i.IsApproved != true) //total pay is recalculated on save 
      { 
       i.Total_Pay = GetValue(i.Total_Bonus_Items) + GetValue(i.Total_Hourly_Pay) + 
        GetValue(i.Total_Line_Items) + GetValue(i.Total_Sick) + 
        GetValue(i.Total_Adjustments) + GetValue(i.Total_Vacation); 
       SavedSummary = false; 
      } 
     } 
    } 

XAML следующим

<DataGrid x:Name="SummaryGrid" Margin="10,66,10,0" CellEditEnding="SummaryGrid_CellEditEnding"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Employee" Binding="{Binding Emp_Name}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Period End" Binding="{Binding Week_End_Date, StringFormat=MM/dd/yyyy}" IsReadOnly="True" /> 
      <DataGridTextColumn Header="Load Pay" Binding="{Binding Total_Line_Items}" Visibility="{Binding Source={x:Reference LoadVisibility}}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Extra Items" Binding="{Binding Total_Bonus_Items}" Visibility="{Binding Source={x:Reference LoadVisibility}}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Hours" Binding="{Binding Total_Hourly_Pay}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Vacation" Binding="{Binding Total_Vacation}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}"/> 
      <DataGridTextColumn Header="Sick" Binding="{Binding Total_Sick}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}"/> 
      <DataGridTextColumn Header="Adjustments" Binding="{Binding Total_Adjustments}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}"/> 
      <DataGridTextColumn Header="Total Pay" Binding="{Binding Total_Pay}"/> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.Header> 
        Approved 
       </DataGridTemplateColumn.Header> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding IsApproved, UpdateSourceTrigger=PropertyChanged}"/> 
        </DataTemplate> 

       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

у меня есть чекбокс в MainWindow, что я помечать к первичному ключу, например Tag="{Binding tkey}", что я захватить с данными, но я не могу понять, как чтобы получить от DataGridCellEditEndingEventArgs или от sender от мероприятия. Есть ли способ захватить ту строку, из которой я пришел, используя тег?

ответ

0

Извините, если я неправильно понял. Вам нужно обновить Total сразу после того, как вы отредактировали значения в любой другой ценной ячейке, не так ли? DataGridCellEditEndingEventArgs хранит номер строки, которую вы редактировали. С его помощью вы можете рассчитать и обновить общее значение только для текущей строки. Я создал простой пример ниже. Он суммирует значения в свойствах val1-val3 и помещает сумму в свойство, называемое «total».

Это простой класс для хранения свойств в соответствии со структурой источника данных. Обратите внимание, что для обновления пользовательского интерфейса вам необходимо реализовать интерфейс INotifyPropertyChanged.

public class DataItem:INotifyPropertyChanged 
{ 
    public DataItem(int v1,int v2,int v3) 
    { 
     val1 = v1; 
     val2 = v2; 
     val3 = v3; 
     total = v1 + v2 + v3; 
    } 

    private int _val1; 
    public int val1 
    { 
     get { return _val1; } 
     set { _val1 = value; InvokePropertyChanged(new PropertyChangedEventArgs("val1"));} 
    } 

    private int _val2; 
    public int val2 
    { 
     get { return _val2; } 
     set { _val2 = value; InvokePropertyChanged(new PropertyChangedEventArgs("val2")); } 
    } 

    private int _val3; 
    public int val3 
    { 
     get { return _val3; } 
     set { _val3 = value; InvokePropertyChanged(new PropertyChangedEventArgs("val3")); } 
    } 

    private int _total; 
    public int total 
    { 
     get { return _total; } 
     set { _total = value; InvokePropertyChanged(new PropertyChangedEventArgs("total")); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void InvokePropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, e); 
    } 
} 

Это фоновый код для MainWindow, где DataGrid находится, здесь данные заполняется и загружается в сеть, а также datagrid_CellEditEnding события обрабатывается.

public MainWindow() 
    { 
     InitializeComponent(); 
     list = new ObservableCollection<DataItem>(); 
     DataItem i1 = new DataItem(3,6,8); 
     DataItem i2 = new DataItem(1, 2, 6); 
     DataItem i3 = new DataItem(9, 7, 22); 
     list.Add(i1); 
     list.Add(i2); 
     list.Add(i3); 
     datagrid.ItemsSource = list; 
    } 

    public ObservableCollection<DataItem> list; 

    private void datagrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     int index = e.Row.GetIndex(); 
     list[index].total = list[index].val1 + list[index].val2 + list[index].val3; 
    } 

И, наконец, XAML для DataGrid:

<DataGrid x:Name="datagrid" AutoGenerateColumns="False" CellEditEnding="datagrid_CellEditEnding"> 
     <DataGrid.Columns> 

      <DataGridTextColumn Header="Val1" Binding="{Binding Path=val1, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="Val2" Binding="{Binding Path=val2, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="Val3" Binding="{Binding Path=val3, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="total" FontWeight="Black" Binding="{Binding Path=total}" /> 
     </DataGrid.Columns> 
    </DataGrid>