我通过DataGrid的“ItemSource”将WPF应用程序DataGrid绑定到ObservableCollection。最初DataGrid确实提出了标题和值,但是对ObservableCollection的升级没有反映出来? (即当我以编程方式返回并增加“Total”值时)我正在使用的ObservableCollection在下面。
任何想法为什么&如何让网格动态更新/绑定?
public class SummaryItem
{
public string ProcessName { get; set; }
public long Total { get; set; }
public long Average { get; set; }
public static SummaryItem ObservableCollectionSearch(ObservableCollection<SummaryItem> oc, string procName)
{
foreach (var summaryItem in oc)
{
if (summaryItem.ProcessName == procName) return summaryItem;
}
return null;
}
}
编辑 - 或许一个附加问题是,在这种情况下,DataGrid是否不是我应该使用的控件来可视化什么是有效的内存表?那就是SummaryItem的observableCollection实际上是内存表。
答案 0 :(得分:7)
如果我看对了你正在使用ObservableCollection。如果您向ObservableCollection添加项目,这些更改应始终由WPF反映,但如果您编辑项目的属性(即更改SummaryItem的“Total”值),则不会更改ObservableCollection而是更改为SummaryItem。
为了实现所需的行为,您的SummaryItems必须实现INotifyPropertyChanged接口,以便在更改属性时“通知”WPF:
// implement the interface
public event PropertyChangedEventHandler PropertyChanged;
// use this for every property
private long _Total;
public long Total {
get {
return _Total;
}
set {
_Total = value;
if(PropertyChanged != null) {
// notifies wpf about the property change
PropertyChanged(this, new PropertyChangedEventArgs("Total"));
}
}
}
答案 1 :(得分:1)
你刚刚遇到了ObservableCollection的经典问题。 OC仅触发项目添加和项目删除事件。这意味着,如果项目发生变化,则不会收到“ItemChanged”事件。
答案 2 :(得分:0)
ObservableCollection仅在您添加或删除项时引发事件,如果您需要引发事件,即使集合中的任何项更改都使用BindingList。