C# 如何在过滤的WPF数据网格中找到正确的行索引
我们正在使用WPF数据网格与VS 2015一起开发WPF应用程序 在此DataGrid中,我们可以过滤更改DataGrids项集合的行(未过滤的我们有p.e.100项和过滤的20项) 此外,我们可以通过单独的编辑对话框更改数据 当该对话框关闭时,应刷新DataGrid中的数据(通过从数据库读取数据并重新设置源),并将SelectedIndex设置为刷新前的索引 当DataGrid未过滤时,您将通过以下方式检测当前选定行的索引:C# 如何在过滤的WPF数据网格中找到正确的行索引,c#,wpf,datagrid,C#,Wpf,Datagrid,我们正在使用WPF数据网格与VS 2015一起开发WPF应用程序 在此DataGrid中,我们可以过滤更改DataGrids项集合的行(未过滤的我们有p.e.100项和过滤的20项) 此外,我们可以通过单独的编辑对话框更改数据 当该对话框关闭时,应刷新DataGrid中的数据(通过从数据库读取数据并重新设置源),并将SelectedIndex设置为刷新前的索引 当DataGrid未过滤时,您将通过以下方式检测当前选定行的索引: int currentIndex = grid.Items.Inde
int currentIndex = grid.Items.IndexOf(grid.CurrentItem);
或
但是当网格被过滤时,我们在这两种情况下都得到了错误的索引
每个示例:
过滤网格后,我编辑第一行的数据,这通常是项目列表中的第四行(index=3),但我得到index=0。
当我提醒变量中的SelectedIndex 0并在刷新后进行设置时,选择的不是筛选网格中的第一项,而是源的第一项。
当我得到SelectedItem并查看属性时,我发现它是错误的项
与此同时,我甚至尝试了米兰提出的准则,但没有成功:
var row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex);
vm.RefreshList();
grid.SelectedIndex = grid.ItemContainerGenerator.IndexFromContainer(row);
在这种情况下,变量行在调用方法RefreshList后断开连接。
甚至在我使用IndexFromContainer之前,索引错误-0而不是3
我们怎样才能得到正确的索引
提前谢谢 那么,你知道解决方案就在你眼前,但你看不见的情况吗 这是我的问题 刷新datagrid的源后,Items集合未被过滤 当我将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;
}
这适用于已筛选和未筛选的列表,甚至当数据按列(升序和降序)排序时也是如此。您得到了正确的索引。您要选择哪个项目?当您尝试选择项目时,列表是否已过滤?@mm8:当我尝试时,列表已过滤。我编辑了过滤列表中的第一项,它在未过滤的网格中有索引3。在筛选的网格中,它选择了索引0。但当我将SelectedIndex after refresh设置为0时,我并没有选择过滤变量的第一行,而是选择了未过滤变量的第一行。与此同时,我已经找到了这种情况发生的原因。刷新后,项目再次包含未筛选的列表。在我设置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;
}