2013-08-30 1 views
0

맞춤 MultiSelectionTreeView을 구현 중입니다. 이 컨트롤은 ItemsControl에서 상속되며 MultiSelectionTreeViewItemTreeViewItem에서 상속됩니다. 거대한 데이터 세트 때문에이 컨트롤에 바인딩하려면이 호스트로 VirtualizationStackPanel을 사용하십시오.가상화 된 컬렉션 항목 컨테이너 일관성

TreeViewItems IsSelected 소품을 ViewModelClass IsSelected 속성에 바인딩했습니다. 트리에서 아래로 스크롤하면 선택한 항목이 뷰포트에서 벗어나 IsSelected 속성이 false로 설정됩니다 (가상화로 인해 Tree에서 MultiSelectionTreeViewItems가 연결 해제 되었기 때문에). 새로운 항목 컨테이너 (MultiSelectionTreeViewItem)가 만들어지고 ViewModel에 따라 IsSelected prop가 true로 설정됩니다.

지금 컨테이너 항목이 밖으로 나가거나 다시 뷰포트로 이동했거나 모델 또는 뷰 모델 계층에 변경 사항이 있었기 때문에 Selected 이벤트가 발생했는지를 판단 할 수 없습니다.

더 나쁜 것은 연결이 끊어진 항목의 IsSelected 속성을 설정할 수 없다는 것입니다. 예를 들어 아래로 스크롤 할 때 더 많은 항목을 Shift 키를 사용하여 선택합니다.

내 제어 구현에서 viewmodel 클래스에 액세스 할 수 없습니다.

아이디어가 있으십니까?

+0

나는 snoop을 사용하여 값이 "local"또는 "binding"으로 지정되었는지 확인합니다. 여기서 bound 값은 녹색으로 강조 표시됩니다. –

답변

0

가상화의 사용자 지정 구현을 만드는 경우이 문제를 해결할 수 있습니다. 필자는 온라인에서 PDF로 구입 한 책에 대한 링크를 발견했습니다. 이 책은 가상화 (8 장)에 대한 훌륭한 장을 가지고 있습니다 ... WPF Control Development Unleashed.

이 정보를 사용하여 내 가상화 패널을 구현했지만 다소 복잡한 것은 분명합니다. 당신이 당신의 자신의 시스템을 구현 할 경우, , 당신은 당신의 뷰 모델 객체에 다른 속성을 추가 할 수 있습니다

public bool IsRealized { get; set; } 

'가상화'항목에 반대 '실현'항목을 실제로 볼 수있는 항목입니다 메모리에만 있습니다.

public bool IsSelected 
{ 
    get { return isSelected; } 
    set { if (IsRealized) { isSelected = value; NotifyPropertyChanged("IsSelected"); } 
} 

그런 다음 사용자 정의 가상화 패널에서, 당신은 IsRealized 특성 각 항목이 실현되는 시간 또는 가상화를 설정할 수 있습니다 만 IsRealized 속성이 true 인 경우 반응에 따라서,이 속성에, 당신은 당신의 IsSelected 속성을 조정할 수 있습니다 ... 나는 당신에게 경고해야한다. .. 일 것이다.