2010-03-11 8 views
10

많은 항목이있는 ListBox가 있습니다. Items는 ObservableCollection을 통해 ListBox에 삽입됩니다. 이러한 항목 중 일부는 ListBox에서 바로 편집 할 수 있습니다. 그러나 편집 된 항목의 인덱스 <에 항목이 추가되면 ListBox의 전체 내용이 아래로 이동합니다.항목 추가 중 목록 상자 항목 고정

우리가하고 싶은 것은 다음과 같습니다 : 항목이 편집 모드 인 경우 화면에서 위치를 고정하고 싶습니다. 항목이 컬렉션에 추가되고 항목 주변의 UI가 변경되면 문제가 없습니다. 그러나 항목의 위치는 화면에서 일정하게 유지되어야합니다.

지금까지 수행 할 수 있었던 유일한 작업은 ScrollChanged 이벤트에 연결하고 대부분 BringIntoView 또는 ScrollIntoView 메서드를 사용하여 항목이 UI의 어딘가에 항상 표시되는지 확인할 수 없지만 그 위치를 잠그는 것.

누구나 이와 같은 작업을 수행하고 도움을 줍니까?

+0

나는 이것을 대답으로 제시하고 싶지 않았지만, 만약 이것을해야만했다면 (그리고 만약 당신이 데이터 바인딩을 사용한다면) 아이템을 편집 할 때 데이터 바인딩을 깨뜨리는 것이고, 편집이 완료되면 datacontext가 다시 나타납니다. – Dave

답변

0

항상 컬렉션의 끝 부분에 항목을 추가 할 수 있습니다. 그렇지 않으면 ScrollViewer를 스크롤하면서 올바른 방향으로 가고 있다고 생각합니다. '편집 모드'를 입력 할 때 현재 수평 오프셋을 추적하십시오.


ScrollViewer sv = listBox.GetScrollViewer(); 
double indexPos = sv.HorizontalOffset; 

그러나 ObservableCollection.CollectionChanged 이벤트에 연결하는 것이 좋습니다. 이벤트가 발생하면 새 값이 '수정 모드'항목 위에 삽입되었는지 확인하십시오. 그렇다면 다음 코드를 실행하십시오.


ScrollViewer sv = listBox.GetScrollViewer(); 
sv.ScrollToHorizontalOffset(indexPos+1); // This will obviously require an offset 
+0

매우 흥미 롭습니다. 나는 내일 이것을 시험해보고 그것이 어떻게 작동하는지 다시보고 할 것이다. 감사. –

0

단순히 움직이는 것을 원하지 않는 문제입니까? 또는 색인 번호로 언급 한 항목을 참조하는 데 문제가 있으며 변경 사항을 적용 할 때 색인의 변경으로 인해 다른 색인이 변경된 경우 (이전 색인에있는 항목에 적용하는 것과 같은) 문제가 발생합니까?

인덱스 변경으로 인해 코드에서 문제가 발생하는 경우 인덱스를 사용하지 않고 대신 해당 개체에 대한 참조를 얻습니다. 필요한 항목을 찾으면 나중에 항목의 색인을 얻을 수 있습니다.

1

나는 다음과 같은 문서가 문제를 해결하는 것이라고 생각 : 편집 모드를 입력 할 때

  1. , 당신은 편집중인 객체 목록 상자에서 인덱스와의 ScrollViewer의 HorizontalOffset에 대한 참조를 유지한다.

  2. ObservableCollection.CollectionChanged 이벤트 처리기에서 편집중인 개체의 새 인덱스를 찾습니다. 인덱스가 변경된 경우 편집 된 항목을 현재 가지고있는 항목으로 바꿉니다 (또는 다른 논리를 유지하려는 경우 특정 순서). 그런 다음 ScrollViewer.HorizontalOffset이 변경된 경우 해당 오프셋으로 다시 이동하십시오.

이렇게하면 편집중인 항목이 목록 및 UI의 동일한 위치에 항상 유지됩니다.

희망이 도움이됩니다.

0

ListView로 전환하고 EnsureVisible을 사용할 수 있습니까?

0

나머지 목록 상자를 고정하면 실행 가능한 옵션입니다.추가 된 항목은 편집이 완료되거나 이스케이프 처리 될 때까지 나타나지 않으므로 BeginUpdateEndUpdate을 사용하여 ListBox가 다시 그려지지 않게 할 수 있습니다. 어떻게 편집 과정에 영향을 미칠지 모르겠습니다.

관련 문제