Jim*_*Jim 5 c# wpf datagridview
我正在尝试将我的Excel应用程序转移到WPF数据网格.我要将数据输入到A列,并且在BI列中想要计算A柱的当前单元格和当前单元格,并添加B列previus单元格.计算示例:B2 = B1 +(A2-A1).这样做的最佳方法是什么?
就我个人而言,我首先创建一个表示记录的类,并在该类上实现 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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在显示数据网格的窗口后面的代码中,您需要订阅列表中每个对象的 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.
}
}
Run Code Online (Sandbox Code Playgroud)
如果您将此事件挂钩到绑定列表中的所有记录,那么只要任何属性发生更改,它就会触发。在上面的类中,这适用于 A 和 B。您可以通过 e.PropertyName(简单的字符串比较)过滤您有兴趣监视的属性,并相应地评估业务逻辑。如果您想保持封装性,或者至少将对象的业务逻辑放在对象本身上,则此方法可以是类 recordObject 上的静态方法。不过,您必须提供从该静态方法获取数据网格的功能(可能通过窗口上的静态属性)。所以:
public static void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
Run Code Online (Sandbox Code Playgroud)
并这样连接:
record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);
Run Code Online (Sandbox Code Playgroud)