c#mvvm嵌套ObservableCollection CollectionChanged NewStartingIndex> 0

时间:2015-02-19 21:02:38

标签: c# wpf mvvm observablecollection inotifycollectionchanged

我是stackoverflow的新手。我一整天都在寻找解决方案,所以我决定在这里问一下。

我正在开发一个使用WPF和数据绑定/ MVVM的应用程序。 我有一个嵌套的ObservableCollection,它是Class Program的一部分。两者都正确实现了INotifyPropertyChange。

在我的构造函数中,我创建了一个名为ListPrograms的Program类型的ObservableColletion,并使用程序列表从我的数据服务中填充它。这很好用。 此外,绑定工作正常,在我的主视图中,我选择了一个程序,并且详细视图中显示了嵌套的价格列表。 OnPropertyChange正确触发SalesPrice的每个属性。

我的要求是,在用户输入时,程序需要重新计算嵌套列表的每个行项目中的累积价格。我有一个正确的方法。

为了运行该方法我试图附加一个collectionchanged事件。

`void GetPrograms()
    {        
        ListPrograms.Clear();          

        var prgms = DataService.GetProgramList(SearchStringProgram);

        ListPrograms=new ObservableCollection<Program>(prgms);

        foreach (var prg in ListPrograms)
        {
            prg.SalesPrices.CollectionChanged+=SalesPrices_CollectionChanged;
        }  `

///

   void SalesPrices_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {


        if (e.NewItems != null)
            foreach (SalesPrice item in e.NewItems)
                item.PropertyChanged += SalePrice_PropertyChanged;

        if (e.OldItems != null)
            foreach (SalesPrice item in e.OldItems)
               item.PropertyChanged -= SalePrice_PropertyChanged;
    }

    void SalePrice_PropertyChanged(object sender, PropertyChangedEventArgs e)
   {
        RecalcSalePrice(CurrentProgram.SalesPrices);
    }

我遇到的问题是集合更改事件仅针对我在运行时添加到集合的新SalesPrices进行了注册。我查看了e.NewStartingIndex,它以初始SalesPrice记录的数量开头。 (例如,第一个程序和9个销售价格,它的ObservableColletion和e.NewStartingIndex的值为8)。 当我在运行时将新记录添加到列表中时,偶数正在注册并通知更改。

我认为这种情况正在发生,因为我正在使用一个填充的SalesPrices列表从dataservice传递Program对象,并且该事件仅注册新项目。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首次解析时,只需对所有现有集合项执行事件订阅:

void GetPrograms()
{        
    var prgms = DataService.GetProgramList(SearchStringProgram);

    ListPrograms=new ObservableCollection<Program>(prgms);

    foreach (var prg in ListPrograms)
    {
        prg.SalesPrices.CollectionChanged += SalesPrices_CollectionChanged;

        foreach (SalesPrice item in prg.SalesPrices)
        {
            item.PropertyChanged += SalePrice_PropertyChanged;
        }
    }
}