好吧,今天,我遇到了编程生涯中迄今为止最奇怪的问题之一,我正在构建一个与文件浏览器完全不同的应用程序,并且我需要反转
DataGrid控件,您说的很简单吗? 好好尝试一下,您很快就会遇到相同的问题。 问题是,没有指定的方法可以执行此操作,此外,在Google上进行的搜索显示,还没有多少人需要这样做,所以我不得不自己编写例程,这种见解是我努力的结果,希望没有其他人需要花费数小时来尝试做同样的事情。首先,我们假设
我们正在使用的DataGrid绑定到名为DummyDataItem的类的列表,如下所示:
class DummyDataItem
{
public string Name { get; set; }
public DummyDataItem(string name)
{
Name = name;
}
}
好的,这是我尝试的第一种方法...
public void InvertA()
{
foreach (object o in dataGrid1.Items)
{
DataGridRow row = o as DataGridRow;
if (row.IsSelected == true)
{
row.IsSelected = false;
}
else
{
row.IsSelected = true;
}
}
}
乍一看,这种方法似乎是完全合理的,我们进行了轻描淡写,以便可以检查是否选择了该行,然后逐项将其反转。 但是,运行一下,您很快就会在
DataGrid中居然无法转换为DataGridRow! 嗯,我们必须尝试其他方法...
public void InvertB()
{
var selected = dataGrid1.SelectedItems;
dataGrid1.SelectAll();
for (int x = 0; x < selected.Count; x++)
{
dataGrid1.SelectedItems.Remove(selected[x]);
}
}
一个较短的子,看上去很整洁,这次我们没有出现运行时错误:D但哎呀,现在选择的是随机的负载...太好了。 显然有什么地方出了问题,而您中经验更多的人可能会注意到“
var selected “实际上仅引用选定的项目。这意味着当我们遍历选定的项目时,列表已更改,并且在循环期间不断变化,因此无法使用它。最后的工作方式,从我的上一个示例中,您可以看到我们已经到了一半,但是我们需要使用一个引用列表,该列表在反转时不会改变。 因此,如果我们将每个选中的项目强制转换为它的基类,并添加一个class属性
最好是一个字符串,因为字符串只能读到一个列表中,我们可以跟踪从选择中删除哪些项目(全部选中后)。
public void InvertC()
{
List<string> names = new List<string>();
foreach (object o in dataGrid1.SelectedItems)
{
names.Add((o as DummyDataItem).Name);
}
dataGrid1.SelectAll();
foreach (object z in dataGrid1.Items)
{
if (names.Contains<string>((z as DummyDataItem).Name))
{
dataGrid1.SelectedItems.Remove(z);
}
}
}
在这个例子中,我们从每个
当前选中的DummyDataItem ,选择所有项目,然后根据名称比较选择哪些项目不属于DataGrid的SelectedItems属性。目前,这似乎是完成此任务的最明智的方法,我希望有人觉得这很有用,如果有人有更好的解决方案,请随时与他们分享。
艾米·贝利(Aimee Bailey)。
From: https://bytes.com/topic/xaml/insights/909415-c-wpf-datagrid-invert-row-selection