问候,
我已经设法使用 http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM.aspx 滚动到所选项目但这只会滚动直到到达所选项目。
我希望所选项目显示在数据网格的顶部,目前它显示在数据网格的底部。
有什么办法可以做到这一点吗?
最佳答案
这里似乎有两种情况。一种是当您在 DataGrid
中手动选择一个项目时,另一种是当 SelectedItem
的源属性在您的 View 模型中更改时。您提供的链接中的行为将同时被触发。
ScrollIntoView
的工作方式是,如果新选择的项目在先前选择的项目上方(保留在顶部),它将向上滚动,如果新选择的项目在下方(保留它),它将向下滚动在底部),如果所选项目已经对用户可见,则根本不滚动。因此,您不会总是在 DataGrid
如果您希望 SelectedItem
始终显示在网格的顶部(如果可能),您可以在执行 grid.ScrollIntoView(grid. SelectedItem, null);
.这会产生副作用,即 SelectedItem
将始终显示在顶部,即使它是通过鼠标、键盘等选择的也是如此。
为了能够以编程方式滚动 DataGrid
,您需要创建一个派生自 DataGrid
的 ScrollableDataGrid
public class ScrollableDataGrid : DataGrid
{
private IScrollProvider m_scrollProvider;
public ScrollableDataGrid()
{
m_scrollProvider = OnCreateAutomationPeer() as IScrollProvider;
}
public void ScrollToBottom()
{
while (m_scrollProvider.VerticalScrollPercent < 100)
{
m_scrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.LargeIncrement);
}
}
}
然后你可以稍微修改行为以获得“滚动到顶部”的效果
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is ScrollableDataGrid)
{
ScrollableDataGrid grid = (sender as ScrollableDataGrid);
if (grid.SelectedItem != null)
{
grid.Dispatcher.BeginInvoke(delegate
{
grid.ScrollToBottom();
grid.UpdateLayout();
grid.ScrollIntoView(grid.SelectedItem, null);
});
}
}
}
关于c# - Datagrid MVVM 滚动到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4802450/