Datagrid MVVM滚动到视图中

时间:2011-01-26 08:14:26

标签: c# silverlight mvvm datagrid

问候,

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

我希望所选项目显示在数据网格的顶部,目前它显示在数据网格的底部。

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

3 个答案:

答案 0 :(得分:7)

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

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

然后,您可以稍微修改行为以获得“滚动到顶部”效果

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

答案 1 :(得分:0)

对于数据网格,您知道记录编号:

在您的模块声明....

Dim dv As DataView

Dim cm As CurrencyManager

在您定义数据网格的代码中....

DataGrid1.DataSource = ds.Tables("JoinedTables").DefaultView

dv = New DataView(ds.Tables("JoinedTables"))

cm = CType(Me.BindingContext(dv), CurrencyManager)

当您想要将记录编号设置为最高

Public Sub SetPosition(ByVal recordnumber As Integer)

     On Error Resume Next

     'set position to bottom of grid 
     DataGrid1.CurrentRowIndex = ds.Tables(0).Rows.Count
     DataGrid1.Update()

     'set position at record number
     DataGrid1.CurrentRowIndex = recordnumber
     cm.Position = recordnumber

End sub

答案 2 :(得分:0)

void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (sender is DataGrid)
        {
            DataGrid grid = (sender as DataGrid);
            if (grid.SelectedItems.Count > 1) // <-------- Add row
                return; //<-------- Add row
            if (grid.SelectedItem != null)
            {
                grid.Dispatcher.BeginInvoke(new Action (delegate()
                {                        
                    grid.UpdateLayout();
                    grid.ScrollIntoView(grid.SelectedItem, null);

                }));
            }
        }
    }