如何在过滤的WPF数据网格中找到正确的行索引

时间:2018-01-30 11:16:47

标签: c# wpf datagrid

我们正在使用WPF DataGrid在VS 2015上开发WPF应用程序。

在这个DataGrid中,我们可以过滤更改DataGrids Items-collection的行(Unfiltered,我们有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);

在这种情况下,在调用方法RefreshList之后断开变量行。 甚至在我使用IndexFromContainter之前错误的索引 - 0而不是3。

我们如何才能获得正确的索引?

提前致谢!

1 个答案:

答案 0 :(得分:0)

嗯,你知道这种情况,当你的解决方案在你的鼻子前,但你看不到它?

这是我的问题。

刷新数据网格的源后,Items-collection未经过滤。

当我将SelectedIndex设置为0时,我选择了未过滤列表的第一项。

之后,重新应用了过滤器。

所以我对我的代码进行了一些更改。

现在我提醒了SelectedItem,在刷新之后我在项目的foreach循环中查找 - 这次 - 我设置了正确的SelectedIndex。

示例:

MyItem currentItem = grid.SelectedItem as MyItem;
vm.RefreshList();
int n = 0;
foreach (MyItem item in grid.Items)
{
    if (item.pki == currentItem.pki)
    {
        grid.SelectedIndex = n;
        grid.Focus();
        break;
    }
    n += 1;
}

这适用于过滤和未过滤的列表,甚至当数据按列(上升和下降)排序时。