c# WPF比较列表Datagrid.ItemsSource
本文关键字:Datagrid ItemsSource WPF 比较 列表 | 更新日期: 2023-09-27 18:08:20
我将private List<MaintenanceWindow> tempMaintenanceWindows
绑定到Datagrid,并允许用户编辑Datagrid中的项目以及添加新项目。
现在我考虑如何回滚用户所做的更改,如果没有按保存按钮先关闭窗口。基本上,我想比较一下Datagrid。ItemsSource到我这样填充的临时列表:
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;
}
默认情况下SequenceEqual将比较调用equal函数的每个项,您是否重写了equal?否则,它比较一个类的内存地址。
我也鼓励你在寻找不可变列表比较时使用FSharpList。
"那么在override方法中,我是否需要比较我的维护窗口类"
你必须比较每个有意义的字段,是的。
如果你像这样声明你的MaintenanceWindow:
正如我在评论中所说的,你必须比较每个重要的字段。在下面的实现中,我选择了description,所以如果两个MaintenanceWindow
得到相同的description
,它们将被认为是相等的,SequenceEquals将按预期工作。
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;
}
}