WPF DataGrid ItemsSource绑定到ObservableCollection不会更新超出第一次设置?

时间:2010-09-29 03:26:10

标签: c# .net wpf observablecollection

我通过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实际上是内存表。

3 个答案:

答案 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。