C# DataGrid计算列

C# DataGrid计算列,c#,wpf,datagridview,C#,Wpf,Datagridview,我正在尝试将我的excel应用程序传输到WPF datagrid。我将在A列中输入数据,在B列中,我将计算A列的previus单元格和当前单元格,并添加B列previus单元格。 计算示例:B2=B1+(A2-A1)。这样做的最佳方法是什么 最好是在类中实现该逻辑,并将网格绑定到相应的属性。例如: class SomeData { int A { get; set; } int B { get; set; } int AminusB { get { return A - B; }

我正在尝试将我的excel应用程序传输到WPF datagrid。我将在A列中输入数据,在B列中,我将计算A列的previus单元格和当前单元格,并添加B列previus单元格。
计算示例:B2=B1+(A2-A1)。这样做的最佳方法是什么

最好是在类中实现该逻辑,并将网格绑定到相应的属性。例如:

class SomeData 
{
  int A { get; set; }
  int B { get; set; }
  int AminusB { get { return A - B; } }
}

就我个人而言,我首先要创建一个表示记录的类,并在该类上实现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));
        }
    }
}
然后,在显示datagrid的窗口上的代码隐藏中,您需要订阅列表中每个对象的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.
    }
}
因此:

record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);

这个精确的解决方案对于正在努力实现的目标是行不通的。SomeData的每个实例都必须有一个前一个SomeData的引用,以便根据前一个SomeData上的a和B的值计算B。很好,Adam。我的回答中也没有提到。谢谢,我已经实现了你的解决方案(Nick和Jacob),在同一行上进行了计算,没有任何问题。但是,我仍然无法理解如何获取上一行单元格并将其添加到当前行的单元格B2=B1+(A2-A1)等等。刚刚抓到这个。“上一个单元格”是指上一行吗?是的,同一列上一行的单元格。当前行是2,所以在单元格(B2)中,我想做一个计算=B1+(A2-A1)哇,这是非常详细的答案,谢谢。据我所知,你的回答集中在B栏的自动更新上,这是受欢迎的,但在现阶段不是。我现在想要的是幕后的商业逻辑。吉姆,你能说得更具体些吗?在您的问题中,您通过业务逻辑得到的只是B2=B1+(A2-A1)。我认为你的问题比较笼统,所以我不确定你的意思是什么。我会将其标记为已回答,但我必须研究你建议的内容,并进行大量尝试和错误:)在回答你的评论时,我对你在代码中所做的注释非常感兴趣(例如…//在此处使用idx执行计算…可能会启动级联事件…等等)。理想情况下,我会将该逻辑放在recordObject中,但这似乎是不可能的。并非不可能。只需在窗口上创建一个静态DataGrid属性,并在window_Loaded中为其分配DataGrid。这样,您就可以将对象集合引用为MyWindow.MyDataGrid.ItemsSource。
record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);