【发布时间】:2019-11-24 06:02:19
【问题描述】:
我有一个绑定到 DataGrid 的结构的 ObservableCollection TableRows:
public class TableStruct
{
public string Item1 {get; set;}
public string Item2 {get; set;}
public string Item3 {get; set;}
public string Item4 {get; set;}
public string Item5 {get; set;}
public string Item6 {get; set;}
}
当尝试连续更新单个项目时,我尝试这样做:
for(int i = 0; i < TableRows.Count; i++)
{
if(SomeConditional)
{
TableStruct new_row = TableRows[i];
new_row.Item3 = "changed";
TableRows[i] = new_row;
}
}
但是在运行程序时,DataGrid 没有更新。但是运行此代码确实会更新到 DataGrid 并按预期工作:
for(int i = 0; i < TableRows.Count; i++)
{
if(SomeConditional)
{
TableStruct new_row = new TableStruct();
new_row.Item1 = "same";
new_row.Item2 = "same";
new_row.Item3 = "changed";
new_row.Item4 = "same";
new_row.Item5 = "same";
new_row.Item6 = "same";
TableRows[i] = new_row;
}
}
这里有什么不同?在我看来,它们都完成了相同的任务,但一个比另一个多行。
【问题讨论】:
-
TableStruct应该实现INotifyPropertyChanged。 -
显然是因为 ObservableCollection 观察的是自身的变化而不是它的元素
-
您的班级
TableStruct是否实施INotifyPropertyChanged?我认为您的第一个示例中发生的情况是没有发送更改通知。在第二个示例中,您实际上是在替换TableRows中的一项,这会导致更改通知。 -
重要的区别是第一种情况是
TableRows[i] = TableRows[i],而第二种情况是TableRows[i] = new TableStruct()。第一种情况被 ObservableCollection 忽略。