私は自分のprivate List<MaintenanceWindow> tempMaintenanceWindows
をDatagridにバインドし、ユーザーがDatagrid内の項目を編集し、新しい項目を追加できるようにしました。これは正常に動作します。C#WPF Compare List <T> to Datagrid.ItemsSource
ここでは、保存ボタンを最初に押さずにウィンドウを閉じると、ユーザーが行った変更をロールバックする方法について考えました。基本的に、私は私はこのような人口の一時リストに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 });
私はそうのように2を比較:
if (!tempMaintenanceWindows.SequenceEqual((List<MaintenanceWindow>)mainWinList.ItemsSource))
が、SequenceEqualの結果は常にあると思われますfalseですが、コードをデバッグするときはまったく同じようです。
誰かが助けてくれることを願っています。ありがとう。
クエンティン・ロジャーは動作しますが、私はおそらくそれを行うにneatest方法ではありませんが、それはアプリケーションの私の場合にフィットする私のコードを投稿したいアプローチのソリューションを提供します。
だからこれは私が私のMaintenanceWindowオブジェクトのEqualsメソッドオーバーライドする方法です:デフォルトSequenceEqualでは
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はデフォルトの比較元を使用しますが、MaintenanceWindowに対してequalsをオーバーライドしましたか? –
デフォルトの比較元は、tempElement1.Equals(gridElement1)のように比較しますか?いいえ、私はそれを無効にしませんでした。したがって、オーバーライドメソッドでは、私は自分のMaintenanceWindowクラスのすべてのフィールドを比較する必要がありますか? – jera
すべての重要なフィールドを正確に比較する必要があります。 –