DataGrid рассчитывает столбцы - PullRequest
5 голосов
/ 10 ноября 2011

Я пытаюсь перенести приложение Excel в таблицу данных WPF. Я собираюсь ввести данные в столбец A, а в столбце B я хотел бы сделать расчет, используя ячейку previus и текущую ячейку столбца A и добавить ячейку previus столбца B. Пример расчета: B2 = B1 + (A2-A1). Каков наилучший подход к этому?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Лично я бы начал с создания класса, который представляет записи, и реализовал бы 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);
4 голосов
/ 10 ноября 2011

Лучше всего реализовать эту логику в классе и привязать сетку к соответствующим свойствам. Например:

class SomeData 
{
  int A { get; set; }
  int B { get; set; }
  int AminusB { get { return A - B; } }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...