c# – Datagrid MVVM滚动到视图中

问候,

我已设法使用http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM.aspx滚动到所选项目,但这只会滚动,直到它到达所选项目.

我希望所选项目显示在datagrid的TOP,目前它显示在datagrid的底部.

有没有办法实现这个目标?

解决方法

这似乎有两个场景.一种是在DataGrid中手动选择项目,另一种是在viewmodel中SelectedItem的source属性发生变化时.您提供的链接中的行为将被触发.

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);
            });
        }
    }
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...