2010-05-14 4 views
8

두 개의 데이터 격자가 서로 다른 데이터 테이블에 바인딩되어 있고 각각은 자체보기로 바인딩되어 있습니다.WPF/MVVM : 서로 다른보기에서 두 데이터 그리드의 스크롤 동기화

데이터 테이블의 행 수가 같고 두 표 모두 동일한 스크롤 위치를 유지하기를 원합니다.

MVVM을 사용하여이를 수행하는 방법을 찾는 데 어려움을 겪고 있습니다. 아무도 아이디어가 있습니까?

감사합니다. -Steven

답변

8

CodeProject의에서보세요 Scroll Synchronization

+0

빠른 응답을 보내 주셔서 감사합니다! 이것은 정확히 내가 뭘 찾고 있었는지, 이미 구현하고 작동했습니다 : – stevosaurus

2
이 ScrollToVerticalOffset을 노출하지 않기 때문에 스크롤 동기화 프로젝트에서 Datagrid 작동하지 않습니다

6

나는 약간의 반사 해킹을 통해이 문제를 극복 할 수 있었다 :

<DataGrid Name="DataGrid1" ScrollViewer.ScrollChanged="DataGrid1_ScrollChanged" /> 
<DataGrid Name="DataGrid2" /> 

상기 코드 자체는 다음

private void DataGrid1_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     if (e.HorizontalChange != 0.0f) 
     { 
      ScrollViewer sv = null; 
      Type t = DataGrid1.GetType(); 
      try 
      { 
       sv = t.InvokeMember("InternalScrollHost", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty, null, DataGrid2, null) as ScrollViewer; 
       sv.ScrollToHorizontalOffset(e.HorizontalOffset); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
+1

+1 반사 해킹. 이 코드를 codeproject 문서와 함께 사용하여 WPF Datagrid에 대한 작업 첨부 속성 구현을 달성했습니다. –

0

지금까지 사용해 본 가장 좋은 방법은 VisualTreeHelper 클래스를 사용하여 올바른 ScrollViewer 개체 (그리드 또는 그리드 없음)를 찾는 것입니다. 나는 이것을 여러 프로젝트에서 사용했다. 당신의 어떤 필요하면

이 시도 :

private static bool ScrollToOffset(DependencyObject n, double offset) 
{ 
    bool terminate = false; 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(n); i++) 
    { 
     var child = VisualTreeHelper.GetChild(n, i); 
     if (child is ScrollViewer) 
     { 
      (child as ScrollViewer).ScrollToVerticalOffset(offset); 
      return true; 
     } 
    } 
    if (!terminate) 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(n); i++) 
      terminate = ScrollToOffset(VisualTreeHelper.GetChild(n, i), offset); 
    return false; 
} 

참고 : 나는 일반적으로 목록 상자 클래스를 사용하여이 기능에 직접 전달할 것입니다.

해피 프로그래밍 :)

관련 문제