我有兩個並排綁定到不同數據表的DataGrid,每個都有自己的視圖。WPF/MVVM:在不同視圖中同步滾動兩個數據網格
數據表都具有相同的行數,我希望兩個網格都保持相同的滾動位置。
我無法找到一種方法來使用MVVM做到這一點......任何人有任何想法?
謝謝! -Steven
我有兩個並排綁定到不同數據表的DataGrid,每個都有自己的視圖。WPF/MVVM:在不同視圖中同步滾動兩個數據網格
數據表都具有相同的行數,我希望兩個網格都保持相同的滾動位置。
我無法找到一種方法來使用MVVM做到這一點......任何人有任何想法?
謝謝! -Steven
看看在CodeProject Scroll Synchronization
的滾動同步項目不適合Datagrid的工作,因爲它不公開ScrollToVerticalOffset
我能夠通過一些反映黑客來解決這個問題:
<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的工作附屬屬性實現 – 2012-02-07 13:23:30
我迄今使用的最佳方式是使用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 2010-05-14 20:30:44