C#WPF将List <t>与Datagrid.ItemsSource进行比较

时间:2016-09-21 16:22:19

标签: c# wpf list datagrid itemssource

我将private List<MaintenanceWindow> tempMaintenanceWindows绑定到Datagrid,并允许用户编辑Datagrid中的项目以及添加新项目。这很好。

现在我想到了如果在没有先按下保存按钮的情况下关闭窗口,如何回滚用户所做的更改。基本上,我想将Datagrid.ItemsSource与我填充的临时List进行比较:

foreach (MaintenanceWindow mainWin in maintenanceWindowList)
                tempMaintenanceWindows.Add(new MaintenanceWindow {from = mainWin.from, to = mainWin.to, abbreviation = mainWin.abbreviation, description = mainWin.description, hosts = mainWin.hosts });

我比较两者:

if (!tempMaintenanceWindows.SequenceEqual((List<MaintenanceWindow>)mainWinList.ItemsSource))

但是SequenceEqual的结果似乎总是假的,尽管在调试代码时,它们似乎是完全相同的。

希望有人可以提供帮助。感谢。

Quentin Roger提供了一种方法解决方案,但是我希望发布我的代码,这可能不是最好的方法,但它适合我的应用案例。

所以这就是我覆盖MaintenanceWindow对象的Equals方法的方式:

public override bool Equals (object obj)
        {
            MaintenanceWindow item = obj as MaintenanceWindow;

            if (!item.from.Equals(this.from))
                return false;
            if (!item.to.Equals(this.to))
                return false;
            if (!item.description.Equals(this.description))
                return false;
            if (!item.abbreviation.Equals(this.abbreviation))
                return false;
            if (item.hosts != null)
            {
                if (!item.hosts.Equals(this.hosts))
                    return false;
            }
            else
            {
                if (this.hosts != null)
                    return false;
            }

            return true;
        }

2 个答案:

答案 0 :(得分:2)

默认情况下,SequenceEqual将比较调用相等函数的每个项,是否覆盖等于?否则它会比较一个类的内存地址。

另外,我建议您在寻找不可变列表比较时使用FSharpList

  

&#34;所以在覆盖方法中,我必须比较每个字段   我的MaintenanceWindow课程&#34;

你必须比较每个有意义的字段,是的。

答案 1 :(得分:1)

如果您按照以下方式声明MaintenanceWindow:

正如我在评论中所说,你必须比较每个重要的字段。在下面的实现中我选择了描述,所以如果两个MaintenanceWindow得到相同的description,它们将被视为等于和SequenceEquals ll按预期工作。

 internal class MaintenanceWindow
 {
    public object @from { get; set; }
    public object to { get; set; }
    public object abbreviation { get; set; }

    private readonly string _description;
    public string Description => _description;

    public MaintenanceWindow(string description)
    {
        _description = description;
    }

    public string hosts { get; set; }

    public override bool Equals(object obj)
    {
        return this.Equals((MaintenanceWindow)obj);
    }

    protected bool Equals(MaintenanceWindow other)
    {
        return string.Equals(_description, other._description);
    }

    public override int GetHashCode()
    {
        return _description?.GetHashCode() ?? 0;
    }
}