0

私はスタックオーバーフローが初めてです。一日中解決策を探していたので、ここで質問することにしました。

私は、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 に答える