【发布时间】:2018-01-30 11:16:47
【问题描述】:
我们正在使用 WPF DataGrid 开发一个带有 VS 2015 的 WPF 应用程序。
在这个 DataGrid 中,我们可以过滤更改 DataGrids 项目集合的行(未过滤我们有 p.e. 100 个项目并过滤了 20 个)。
我们还可以通过单独的编辑对话框更改数据。
当该对话框关闭时,应刷新 DataGrid 中的数据(通过从数据库中读取数据并重新设置源)并将 SelectedIndex 设置为刷新前的索引。
当 DataGrid 未过滤时,您将通过以下方式检测当前选定行的索引
int currentIndex = grid.Items.IndexOf(grid.CurrentItem);
或
int currentIndex = grid.SelectedIndex;
但是当网格被过滤时,我们在这两种情况下都会得到错误的索引。
例如: 当网格被过滤时,我编辑第一行的数据,这通常是项目列表中的第四行(索引 = 3),但我得到索引 = 0。 当我提醒变量中的 SelectedIndex 0 并在刷新后设置它时,不是选择过滤网格中的第一项,而是选择源的第一项。 当我得到 SelectedItem 并查看属性时,我发现它是错误的项目。
同时我什至尝试了米兰提出的代码但没有成功:
var row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex);
vm.RefreshList();
grid.SelectedIndex = grid.ItemContainerGenerator.IndexFromContainer(row);
在这种情况下,变量row在调用RefreshList方法后断开。 甚至在我使用 IndexFromContainter 得到错误的索引之前 - 0 而不是 3。
我们怎样才能得到正确的索引?
提前致谢!
【问题讨论】:
-
您正在获得正确的索引。您要选择哪个项目?当您尝试选择项目时,列表是过滤还是未过滤?
-
@mm8:当我尝试它时,列表被过滤了。我编辑了过滤列表中的第一项,它在未过滤的网格中具有索引 3。在过滤的网格中,它具有 SelectedIndex 0。但是当我在刷新后将 SelectedIndex 设置为 0 时,我没有选择过滤变体的第一行,而是未过滤的。同时,我发现了为什么会发生这种情况。刷新后,项目再次包含未过滤的列表。就在我设置 SelectedIndex 之后,应用了网格的过滤器。