2010-11-22 1 views
1

ListView의 ItemsSource 속성에 바인딩을 통해 데이터가 업데이트 될 때 ListView를 세로로 스크롤하는 방법이 있습니까? ListView 또는 기본 GridView 컨트롤에서 원하는 결과를 얻기 위해 속성을 찾지 못하는 것 같습니다. 최신 정보가 항상 사용자에게 표시되도록 스크롤하는 것이 좋을 것입니다. 행이 컨트롤에 추가 될 때 스크롤 막대가 이미 나타나지만 가장 최근 행은 표시되지 않습니다.WPF ListView : 사용자 지정 스크롤 동작

자동 스크롤 기능이있는 다른 유형의 컨트롤을 사용해야할까요? 두 개의 열만 있습니다. 하나는 DateTimes를 포함하고 다른 하나는 간단한 문자열을 포함합니다. 내 통제 선택이 너무 제한적이라고 생각하기 시작했습니다.

내 XAML은 다음과 거의 같습니다이 필요한 곳 ​​

<ListView ItemsSource="{Binding Updates}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Timestamp" DisplayMemberBinding="{Binding TimeStamp}"/> 
      <GridViewColumn DisplayMemberBinding="{Binding UpdateString}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

을, 당신은 * 할 수의 GridView을 찾고 있습니다 필요할 때 * 스크롤합니다. 데이터 화면 이상을 포함하고 있거나 자동 스크롤이 * 자동으로 발생하여 이전 데이터가 뷰포트에서 밀려 나오고 최신 데이터가 추가되면 스크롤됩니다. @ 대니얼이 첫 번째 답변을하지만 두 번째는 애니메이션 /'EventTriggers'가 필요합니다. :) –

+0

좋은 점, 나는 분명히해야했다. 데이터 화면 이상이있을 때 스크롤하고 데이터가 GridView를 채우는 것처럼 스크롤해야합니다. 나는 그 정보를 추가 할 것이다. – jlafay

답변

2

스크롤을 조작하기 위해 ListView의 ScrollViewer 객체가 노출되어있는 것을 발견했습니다. 내 DataContext에는 ObservableCollection에서 파생 된 컬렉션이 포함되어 있으며 코드 뒤에는 CollectionChanged 이벤트에 이벤트 핸들러가 연결되어 있습니다. Decorator을 사용하여 ListView (경계)의 첫 번째 하위 항목을 노출했으며 그 하위 항목은 ScrollViewer입니다. 거기에서 원하는 동작을 달성하기 위해 ScrollToBottom() 메서드를 호출합니다. ListView이 포함되어 내보기에 대한 뒤에 코드에서

이는 내가 Anshulee's WindowsClient blog postScrollViewer을 노출하는 방법을 발견
MyViewModel viewModel = DataContext as MyViewModel; 

viewModel.MyCollection.CollectionChanged += (sender,e) => 
{ 
    if(e.NewItems != null) 
    { 
     Decorator border = VisualTreeHelper.GetChild(SummaryListView, 0) as Decorator; 
     ScrollViewer scroll = border.Child as ScrollViewer; 
     scroll.ScrollToBottom(); 
    } 
}; 

코딩 어떻게입니다. 사용자 지정 컬렉션의 항목의 최대 수를 아래로 스크롤 한 후 만난 경우

편집 이전에, 나는 확인했다. 이 응용 프로그램은 하나의 컴퓨터에서 ListView의 15 줄을 표시하고 다른 컴퓨터에서는 25 줄을 표시 할 수 있기 때문에 다른 화면 해상도에서도 잘 작동하지 않습니다. 이제는 항상 최신 항목을보기 위해 항상 맨 아래로 스크롤해야합니다.

1

당신이에 관계없이 항상 수평 또는 수직 스크롤을 원하는 경우 당신은 또한 지정할 수 있습니다 내용을 필요로 할 때, 자동 (스크롤됩니다 ScrollViewer에 객체를 사용한다 여부,뿐만 아니라 일부 다른 것들)

<ScrollViewer> 
    <GridView> 
     <!-- gridview definition --> 
    <GridView> 
</ScrollViewer> 

대한 추가 정보를 원하시면 MSDN

+0

GridView 헤더가 보이지 않게 스크롤되기 때문에 불행히도이 기능이 작동하지 않습니다. – jlafay

+0

어떤 방법 으로든 전체 GridView가 아닌 ​​항목 만 래핑 할 수 있습니다. 헤더를 스크롤하지 않도록하고 싶습니다. – jlafay

0

에 나는 확신 일을 해요 VirtualizingStackPanel에서 덮개 아래에서 사용 중입니다 ... 이는 항목이 필요할 때까지 존재하지 않는다는 것을 의미합니다. 따라서 15000 개의 항목이있는 경우 필요에 따라 15000 개의 항목을 렌더링하는 것은 의미가 없습니다.

가장 쉬운 방법은 정렬을 강제로 수행하여 최신 데이터가 맨 위에 남을 수 있습니다. 그러면 항목을 아래로 밀어내는 모습을 보여 주지만 가장 오래된 항목이므로 사용자가 시작하지 않으면 스크롤하여 중요하지 않습니다.

0

Listview에는 ScrollIntoView(object item)이라는 메서드가 있습니다.

이렇게하면 Listview가 지정된 항목이있는 위치로 스크롤됩니다.

리스트 뷰에 바인더 제본 된 컬렉션이 때 컬렉션이 변경되었을 때, 당신은 같은이 메소드를 호출 할 수 있습니다 : 다니엘의 대답 @ 고려

private void myCollectionChanged() 
{ 
    myListView.ScrollIntoView(myCollection.Last()); 
} 
+0

그 방법을 시도해 보았는데, 아래쪽 항목으로 스크롤하지 않았습니다. 나의 받아 들여진 응답 (및 나가 제공 한 것)은 나의 신청에서 작동 한 무슨이다. – jlafay

+0

정말 이니? 내 응용 프로그램에서 작동하기 때문에. – Flagbug

+0

그래, 그게 내가해야 할 일보다 훨씬 더 간단 할거야. 나는 복잡성을 최소화하기 위해 단순하고 읽기 쉬운 것을 선호한다. – jlafay