0

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

我正在开发一个使用 WPF 和数据绑定/MVVM 的应用程序。我有一个嵌套的 ObservableCollection,它是类程序的一部分。两者都正确实现了 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 列表的 Program 对象,并且该事件仅注册新项目。

任何想法?

坦率

4

1 回答 1

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;
        }
    }
}
于 2015-02-19T21:34:52.807 回答