我们正在使用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。
我们如何才能获得正确的索引?
提前致谢!
答案 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;
}
这适用于过滤和未过滤的列表,甚至当数据按列(上升和下降)排序时。