2011-09-21 4 views
0

두 탭이있는 탭 컨트롤이 포함 된 화면이있는 WPF 응용 프로그램이 있습니다. 각 탭에는 DataGrid가 있으며, 각 DataGrid는 Part 객체의 ObservableCollection에 바인딩됩니다. 파트에는 그리드 사이에서 동기화해야하는 몇 가지 "수량"속성이 있습니다. 예를 들어 사용자가 grid1의 partABC 수량을 변경하면 partABC를 동일한 양의 grid2에 추가하거나 grid2에 partABC가 이미 포함되어있는 경우 grid1을 반영하도록 수량을 변경해야합니다.별도의 컬렉션 속성을 동기화하는 방법은 무엇입니까?

내 문제는 이것이 양방향으로 작동해야한다는 것입니다. 두 모눈의 모든 부분에 PropertyChanged 핸들러를 설정하면 끊임없이 서로의 수량을 업데이트하므로 무한 루프가됩니다. 지금까지 탭 컨트롤 선택 변경 이벤트 중에 이것을 처리하고 목록 중 하나를 반복하고 수량을 하나씩 설정했습니다. 이것은 사용자가 잠재적으로 목록에 수천 개의 부품을 추가 할 수 있다는 것을 깨닫고 그 시점에서이 프로세스가 완료하는 데는 용인 할 수없는 시간이 걸립니다 (4500 개의 부품 객체의 경우 약 25 초).

첫 번째 그리드 사용자가 단순히 그들이 찾고있는 부분으로 스크롤하고 수량을 입력는 "선택 목록"의 일종으로서, 데이터베이스의 모든 부분을 포함
편집. 두 번째 눈금에는 사용자가 수동으로 입력 한 부품 만 포함되어있어 원하는 부품 번호를 입력하는 것이 좋습니다. Grid2는 항상 grid1의 하위 집합입니다.

+1

새 값을 기존 값과 비교하고 올리지 않으면 무한 루프가 발생하지 않습니다. 속성이 동일하면 이벤트가 변경됩니다. 예를 들어,'set {if (value! = _myproperty) {_ myproperty = value; RaisePropertyChanged (() => MyProperty);}}' – Dmitry

답변

1

데이터 바인딩을 통해이를 수행 할 수 있습니다. 중복 된 Part 객체를 생성해서는 안됩니다. 대신 파트를 보유하고있는 콜렉션을 복제하십시오.

Part sharedPart = new Part(); 
Part onlyInTabA = new Part(); 
Part onlyInTabB = new Part(); 

ObservableCollection<Part> tabAParts = new ObservableCollection<Part>() { sharedPart, onlyinTabA }; 
ObservableCollection<Part> tabBParts = new ObservableCollection<Part>() { sharedPar, onlyInTabB }; 

지금 탭 B에 그리드에 데이터 바인딩 할 탭 A와 tabBParts에 그리드에 데이터 바인딩을 tabAParts를 사용

당신의 Part 클래스는 다음 모두 모두 그리드를 업데이트합니다 sharedPart의 속성을 변경 INotifyPropertyChanged를 구현하는 경우 탭. 새 파트를 추가 할 때 두 파트를 모두 공유하도록 선택하거나 특정 탭을 유지하도록 선택할 수 있습니다.

+0

죄송합니다, 방금 일부 정보가 누락되었습니다. Clairty의 초기 게시물을 수정했습니다. – drowned

+0

사실 나는이 아이디어가 여전히 효과가 있다고 가정합니다. tabB 컬렉션에 삽입해야 할 때마다 tabA 컬렉션의 기존 파트를 추가해야합니다. 훌륭해, 고마워. – drowned

관련 문제