2009-03-17 11 views
1

私はここにいくつかの基礎を忘れていると確信していますので、私に同行してください。プロパティ変更イベントを祖先に渡すにはどうすればよいですか?

私は2つのオブジェクト、SalesOrderとSalesOrderLineItemを持っています。 lineitemsはSalesOrderのObservablecollection<SalesOrderLineItem>に保存されています。ラインアイテムを追加すると、データバインドされたlistViewは新しいアイテムについて知ります。

ここで問題が発生している場所は次のとおりです。SalesOrderには、「OrderTotal」という読み取り専用プロパティがあり、これは結合されたすべてのラインアイテムの総価格が何であるかを知っています。

広告申込情報の数量または価格を変更した場合、変更通知を「OrderTotal」にバブルアップする方法はわかりません。

両方のクラスが継承し、INotifyPropertyChangedを呼び出します。

私は行方不明ですか?

答えて

2

ObservableCollectionは、アイテムが追加、削除、またはリストがリフレッシュされたときにのみ通知し、コレクション内のItemのプロパティが変更された場合は通知しません。

SalesOrderクラスは、各SalesOrderLineItemのPropertyChangedイベントをリッスンする必要があります。

-

たOrderTotalプロパティも合計するたびに生成する、ダイナミックな可能性が...

+0

これは私が考えていることですが、WPFは非常に多くの力を持っているようですが、別の解決策があるのか​​疑問です。私はこれと一緒に行くつもりですが、これに対処するよりエレガントな方法があるように感じる。 – Russ

+0

残念ながら私はAaronに同意します。あなたは各SalesOrderLineItemとコレクションに耳を傾ける必要があります。 WPFにはバブルのあるRoutedEventsがありますが、これらはビジュアルツリーにのみ適用されます。任意のオブジェクトグラフでそれらを使用することはできません。 –

+0

私は同意します。 WPFでのバインドは非常に強力で、これを行うためのより良い方法があるかもしれません。あなたは別の方法であなたの質問をしたいかもしれません。今はObservableCollectionがこの問題を解決する方法を探していると信じています。より一般的に、そしてdiffの件名でもう一度聞いてください –

0

あなたは冒険を感じた場合は、BindableLinqまたは類似した何かを試すことができます。 変更をリッスンするクエリの結果を公開することができます。

まだベータ版ではありませんが、私はそれが今までになるとは確信していません... ContinuousLinqはもう一つですが、まだSilverlightをサポートしていません。

それ以外の場合、コレクションが変更されるたびに各子を聞き取り、ハンドラを追加/削除する必要があります。

+0

私はさらに多くのアセンブリに依存するように準備ができていません。 – Russ

0
public ObservableCollection<TestClass> List 
    { 
     get { return _List; } 
     set { 
      if (_List!= value) 
      { 
       _List = value; 
       raisePropertyChange("List"); 
       List.ToList().ForEach(i=> i.PropertyChanged+= (o,e)=> 
       { 
        //PropertyChanged.Raise(() => List); 
     raisePropertyChange("List"); 
     //or what ever you want 
       } 
      ); 


      } 
     } 
    } 
+0

複数の質問に全く同じ回答を投稿しないでください。それはすべてに適していないか、質問は重複しているためフラグを立てる/閉じてください。 – kleopatra

+0

OKもう一度やり直す –

関連する問題