【问题标题】:WPF Datagrid Auto Scrolling in MVVM ScenarioMVVM场景中的WPF Datagrid自动滚动
【发布时间】:2013-06-23 21:01:10
【问题描述】:

我有一个 MVVM 视图,我将 DataGrid.ItemsSource 绑定到底层视图模型中的 ObservableCollection。数据是我的应用程序从服务器提取的事件的实时日志。视图模型将日志条目添加到我的 ObservableCollection 中。

我希望我的 DataGrid(假设它已经一直滚动到底部)自动滚动,以便始终可见最近添加的条目。鉴于 MVVM 设置,有谁知道如何做到这一点?

【问题讨论】:

    标签: wpf data-binding mvvm datagrid


    【解决方案1】:

    根据 MVVM 设置,有人知道如何做到这一点吗?

    这里真的有两个简单的选择:

    1. 使用后面的代码。虽然 MVVM 确实不鼓励这样做,但有时代码背后仍然是合适或合理的。由于这是一个 100% 与纯视图相关的问题,因此(在我看来)使用代码背后并不是不合理的。
    2. 创建附加属性或 Blend 样式的行为以将所需的运行时行为添加到来自 xaml 的视图。这仍然是有效的代码隐藏,但将其移动到 可重用 形式,因为您编写的行为可以在任何 DataGrid 上使用。

    【讨论】:

    • 我很确定我最终会在后面的代码中实现它,但我不确定将我的“操作”绑定到什么事件。我似乎找不到在底层数据源更改时触发的事件。我不想附加到我的底层数据源的 CollectionChanged 事件,因为它已经需要几个绑定才能通过我的视图到达它,并且 ObservableCollection 本身可能会不时更改(例如当服务器连接丢失时)。
    • @NathanA 查看LoadingRow 事件 - 这应该在任何时候添加新的数据行时触发,这(我假设)将允许您根据需要处理滚动。
    • @ReedCopsey 感谢您的想法。我试过了,但这只有在我关闭 EnableRowVirtualization 时才有效,因为只有在加载 DataGridRow 时才会调用 LoadingRow。如果网格正在虚拟化,则新项目尚不可见,因此在添加新项目时不会创建 DataGridRow。更不用说,当您上下滚动时,每个移入视图的项目都会调用该事件。所以是的,如果我愿意禁用 EnableRowVirtualization,这是一个解决方案,但由于我的日志可能包含数千个条目,我不确定是否要考虑关闭它。
    • @NathanA 对于虚拟化,我认为您唯一真正的选择是听ItemsSource。您可以通过侦听对 DataGrid 的 ItemsSouce 属性的更改来进行完全抽象的行为(因此它不会与您的实际数据相关联)。见:stackoverflow.com/a/10709051/65358
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2017-07-12
    • 1970-01-01
    • 2012-11-17
    • 2011-06-15
    • 2014-06-24
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多