Лично я бы начал с создания класса, который представляет записи, и реализовал бы INotifyPropertyChanged для этого класса.
public class recordObject : INotifyPropertyChanged
{
private int a;
public int A
{
get
{
return a;
}
set
{
a = value;
OnPropertyChanged("A");
}
}
private int b;
public int B
{
get
{
return b;
}
set
{
b = value;
OnPropertyChanged("B");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Затем в своем коде позади окна, в котором вы видите сетку данных, вы захотите подписаться на PropertyChanged для каждого объекта в списке. Тогда вам придется вручную вычислять значения столбца всякий раз, когда эти свойства изменяются. Я знаю, но это сработало бы.
Событие изменения свойства будет выглядеть следующим образом:
void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
var objectList = DataGrid.ItemsSource as List<recordObject>;
var myRecord = sender as recordObject;
if (objectList != null && myRecord != null)
{
int idx = objectList.IndexOf(myRecord);
// Perform your calculations here using idx to access records before and after the current record
// making sure to check for list boundaries for top and bottom.
// Also note that this will likely kick off cascading event calls so make sure you're only changing
// the previous or following record object.
}
}
Если вы подключите это событие ко всем записям в вашем связанном списке, оно будет срабатывать при каждом изменении любого свойства. В вышеприведенном классе это применимо как к A, так и к B. Вы можете отфильтровать свойства, которые вы хотите отслеживать с помощью e.PropertyName (простое сравнение строк) и соответствующим образом управлять бизнес-логикой. Если вы хотите сохранить инкапсуляцию или, по крайней мере, поместить бизнес-логику для объекта в сам объект, этот метод может быть статическим для класса recordObject. Вы должны были бы обеспечить получение сетки данных от этого статического метода, хотя (вероятно, через статическое свойство в вашем окне). Итак:
public static void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
и связано так:
record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);