2009-03-17 3 views
1

나는 기초의 일부를 여기에서 놓치고있다라고 확신한다. 그래서 나와 맺어 라.속성 변경된 이벤트를 조상에게 어떻게 전달합니까?

두 개체, SalesOrder 및 SalesOrderLineItem이 있습니다. lineitems는 SalesOrder의 Observablecollection<SalesOrderLineItem>에 보관되며, 광고 항목을 추가하면 데이터 바인딩 된 listView가 새 항목을 인식합니다.

여기에 문제가있는 곳은 다음과 같습니다. SalesOrder에는 결합 된 모든 광고 항목의 총 가격이 얼마인지를 알고있는 "OrderTotal"이라는 읽기 전용 속성이 있습니다.

광고 항목의 수량 또는 가격을 변경하면 변경 알림을 "OrderTotal"까지 버블 링하는 방법을 알지 못합니다.

두 클래스 모두에서 상속하고 INotifyPropertyChanged을 실행합니다.

내가 빠졌습니까?

답변

2

ObservableCollection은 항목이 추가, 제거 또는 목록이 새로 고쳐지는 경우에만 알려주고 컬렉션 내의 항목 속성이 변경되는 경우는 알려주지 않습니다.

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 다시 해보지 않겠습니다. –

관련 문제