The*_*der 7 c# silverlight datagrid mvvm
问候,
我已设法使用http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a havenGrid-when- using- MVVM.aspx 滚动到所选项目,但这只会滚动直到它到达所选项目项目.
我希望所选项目显示在datagrid的TOP,目前它显示在datagrid的底部.
有没有办法实现这个目标?
这似乎有两个场景.一种是在手动选择项目时,DataGrid另一种是SelectedItem在viewmodel中更改源属性时.您提供的链接中的行为将被触发.
可行的方法ScrollIntoView是,如果新选择的项目位于先前选择的项目之上(将其留在顶部),则向上滚动;如果新选择的项目在下方(将其保留在底部),则向下滚动,如果所选项目已对用户可见.所以你不会总是得到所选项目的底部DataGrid
如果您希望SelectedItem始终显示在网格的顶部(如果可能),您可以在执行之前滚动到底部grid.ScrollIntoView(grid.SelectedItem, null);.这有副作用,即使它是由鼠标,键盘等选择的,SelectedItem它将始终显示在顶部.
为了能够以DataGrid编程方式滚动,您需要创建一个ScrollableDataGrid派生自DataGrid
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以稍微修改行为以获得"滚动到顶部"效果
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);
});
}
}
}
Run Code Online (Sandbox Code Playgroud)