(C#WPF)DataGrid反转行选择...

好吧,今天,我遇到了编程生涯中迄今为止最奇怪的问题之一,我正在构建一个与文件浏览器完全不同的应用程序,并且我需要反转

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 ,选择所有项目,然后根据名称比较选择哪些项目不属于DataGridSelectedItems属性。

目前,这似乎是完成此任务的最明智的方法,我希望有人觉得这很有用,如果有人有更好的解决方案,请随时与他们分享。

艾米·贝利(Aimee Bailey)。

From: https://bytes.com/topic/xaml/insights/909415-c-wpf-datagrid-invert-row-selection

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值