c# - Datagrid MVVM 滚动到 View

标签 c# silverlight mvvm datagrid

问候,

我已经设法使用 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,您需要创建一个派生自 DataGridScrollableDataGrid

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/

相关文章:

c# - 单个 WCF channel 性能与多个 channel

c# - 如何根据动态页面内容自动生成SEO关键词?

entity-framework - 将 ESQL 转换为 LINQ 到实体。按相关实体排序

.net - 我应该使用哪些资源将我的 .NET 应用程序移植到 Mono 或 Moonlight?

wpf - 选择选项卡项内容时如何聚焦 WPF 选项卡项?

c# - WP8 - 将命令绑定(bind)到列表中的按钮和开关

wpf - 在 Prism/Composite MVVM WPF 应用程序中使 View 模型激活感知

c# - Entity Framework 通用

c# - 捕获所有不捕获静态文件的路由

javascript - 是否可以阻止 Silverlight 错误弹出错误对话框?