두 개의 데이터 격자가 서로 다른 데이터 테이블에 바인딩되어 있고 각각은 자체보기로 바인딩되어 있습니다.WPF/MVVM : 서로 다른보기에서 두 데이터 그리드의 스크롤 동기화
데이터 테이블의 행 수가 같고 두 표 모두 동일한 스크롤 위치를 유지하기를 원합니다.
MVVM을 사용하여이를 수행하는 방법을 찾는 데 어려움을 겪고 있습니다. 아무도 아이디어가 있습니까?
감사합니다. -Steven
두 개의 데이터 격자가 서로 다른 데이터 테이블에 바인딩되어 있고 각각은 자체보기로 바인딩되어 있습니다.WPF/MVVM : 서로 다른보기에서 두 데이터 그리드의 스크롤 동기화
데이터 테이블의 행 수가 같고 두 표 모두 동일한 스크롤 위치를 유지하기를 원합니다.
MVVM을 사용하여이를 수행하는 방법을 찾는 데 어려움을 겪고 있습니다. 아무도 아이디어가 있습니까?
감사합니다. -Steven
CodeProject의에서보세요 Scroll Synchronization
나는 약간의 반사 해킹을 통해이 문제를 극복 할 수 있었다 :
<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 반사 해킹. 이 코드를 codeproject 문서와 함께 사용하여 WPF Datagrid에 대한 작업 첨부 속성 구현을 달성했습니다. –
지금까지 사용해 본 가장 좋은 방법은 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;
}
참고 : 나는 일반적으로 목록 상자 클래스를 사용하여이 기능에 직접 전달할 것입니다.
해피 프로그래밍 :)
빠른 응답을 보내 주셔서 감사합니다! 이것은 정확히 내가 뭘 찾고 있었는지, 이미 구현하고 작동했습니다 : – stevosaurus