2009-12-03 4 views
1

Silverlight 응용 프로그램에서 DataGrid를 사용하여 타이머에 새로 고침되는 일부 데이터를 표시하고 있습니다. 내 문제는 이것이 일어날 때 그리드의 세로 스크롤 막대가 위쪽으로 재설정되는 반면, 같은 위치에 머물러 있기를 원한다는 것입니다. 아무도 내가 어떻게 이런 일이 일어날 수 있는지 안다?Silverlight DataGrid의 ItemSource 업데이트시 스크롤 위치 유지

그리드의 ItemsSource 속성을 재정 의하여 세로 스크롤 위치를 저장하고 다시 설정해 보았습니다.하지만 스크롤 막대에만 영향을주고 올바른 행을 표시하지는 않습니다. 이 동작을 강제하는 방법이 있습니까?

답변

0

당신은 UI가 같은 자체를 새로 고칠 수 있도록 UI 스레드 죽 selectedItem 그 설정을 시도 할 수 있도록

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Person p = new Person() { Name="sss",Age=11}; //datagird's itemsSource is Collection<person> 
     people.Add(p); 
     dg.SelectedItem = p; //dg is my datagrid name 
     Dispatcher.BeginInvoke(() => { dg.SelectedItem = p; }); 
    } 

는 의미가 왜 새로운 행이 뷰 모델 죽로드 그게 있도록된다고 가정 임 거기에 BeginInvoke를 배치합니다. 뷰 모델 작업이 다른 스레드에서 실행, 그냥 작동하지 않을 수 있습니다 자신의 selectedItem을 설정하기 때문에,이 다음은 목록 상자의 스크롤 바 위치 설정에 대한 비슷한 질문이 someone else

0

같은 유사한 기술을 사용할 수 있어야합니다. 스크롤하려는 항목을 기억하고 DataGrid를 다시 바인딩하여 문제를 해결했습니다. 원하는 기능을 구현하기 위해 LayoutUpdated 이벤트를 처리합니다.

void MyDataGrid_LayoutUpdated(object sender, EventArgs e) 
    { 
     // Reference the data item in the list you want to scroll to. 
     object dataItem = yourDataItem; 

     // Make sure the item is not null and didn't already scroll to the item. 
     if (dataItem != null && this.dataItemScrolledTo != dataItem) 
     { 
      // Remember the item scrolled to. 
      this.dataItemScrolledTo = dataItem; 

      // Scroll datagrid to the desired item. 
      MyDataGrid.ScrollIntoView(dataItem, MyDataGrid.Columns[0]); 
     } 
    } 
1

마지막으로 올바른 답변을 찾지 못했습니다. 그리드에 선택된 현재 요소를 유지하고 싶었지만 ICollectionView 새로 고침 (MVVM을 사용하고 서버에서 자동 업데이트를 얻음)에서 작동하지 않습니다.

ScrollIntoView()은 (는) 현재 선택한 항목이 표시되지 않을 수도 있기 때문에 나를위한 옵션이 아닙니다. CurrentChanged 이벤트가 제어 불능 상태에 빠지게하는 것도 꽤 힘든 일이었습니다.

마지막으로, Infragistics 그리드를 사용하고 상자에서 그대로 사용합니다. 문제가 해결되었습니다.

DevExpress 무료 그리드를 살펴볼 수 있습니다. 나는 그것이 좋은 행동을했다 (나는 그것을 테스트했지만 결과를 기억할 수 없다) 같았다.

0

클래스 레벨 변수가 필요 없도록 CodeMaster의 솔루션을 수정했습니다. 이 코드를 ItemsSource를 업데이트하는 메서드에 넣습니다. 이벤트 핸들러를 동적으로 생성하고 첨부 한 다음 분리합니다.

EventHandler MyDataGrid_LayoutUpdated = null; 

MyDataGrid_LayoutUpdated = (s, e) => 
    { 
     MyDataGrid.ScrollIntoView(dataItem, MyDataGrid.Columns[0]); 
     MyDataGrid.LayoutUpdated -= MyDataGrid_LayoutUpdated; 
    }; 

MyDataGrid.LayoutUpdated += MyDataGrid_LayoutUpdated; 
관련 문제