使用重写IsEqual方法绑定到列表时的DataGrid标识问题

时间:2011-08-08 08:45:45

标签: c# wpf datagrid override identity

想象一下以下场景:我有一个DataGrid,我绑定到包含对象的列表。每个对象代表一个包含各种数据的行(名称,客户,服务器名称等)现在让我们说可以有相同的对象或行(名称,客户,服务器名称等)相同。

当我将列表绑定到DataGrid时,一切正常,我可以使用光标在网格中移动。但是,为了制作UnitTests,我已经覆盖了相关对象的Equals方法。像这样:

public override bool Equals(object obj2)
{
    ConnectionDestination compareObject = obj2 as ConnectionDestination;
    if (compareObject == null)
    {
        return false;
    }


    if ((this.Kunde != compareObject.Kunde) || this.Filiale != compareObject.Filiale || this.Bez != compareObject.Bez ||
            this.Username != compareObject.Username || this.Password != compareObject.Password)
    {
        return false;
    }
}

    public override int GetHashCode()
    {
        return this.Kunde.GetHashCode() ^ this.Bez.GetHashCode() ^ this.Filiale.GetHashCode() ^ this.Servername.GetHashCode() ^ this.Username.GetHashCode() ^ this.Password.GetHashCode();
    }

现在的问题是,一旦我有两个完全相同的行并且调用了Equals方法,DataGrid就会混淆并选择多行,或者当我在网格中移动时它会变得更加混乱。

因此,问题是:有没有办法进行适当的平等比较以防止此类问题的发生?

1 个答案:

答案 0 :(得分:0)

行为是正确的,并遵循所有WPF列表实现选择逻辑的逻辑。我看到解决方法的唯一方法是在项目源中使用之前包装项目 如果您使用MVVM模式,这将导致每行ViewModel。

作为DataGrid的旁注:还要注意GetHashCode() - Method为相等的对象返回相同的值。否则,选择也会有问题。从您的示例中我不知道您是否覆盖了GetHashCode()。如果你重写Equals(),必须覆盖GetHashCode(),这不是一个真正的问题,我只想提一下。