C# WPF数据网格可以';t更改所选行:卡在第一行

C# WPF数据网格可以';t更改所选行:卡在第一行,c#,wpf,datagrid,.net-4.0,wpfdatagrid,C#,Wpf,Datagrid,.net 4.0,Wpfdatagrid,简而言之,我的问题是WPF DataGrid不允许我选择第一行以外的任何内容。当我第一次用数据填充它时,没有选择任何行。接下来,无论单击哪一行,第一行都会亮起。当我使用OneWayToSource绑定SelectedItem属性时,我看到确实选择了正确的行。如果我选择再次单击其他行,则不会发生任何事情:UI仍停留在第一行,SelectedItem属性保留以前正确的值。此时,我必须按住ctrl键并单击第一行以取消选择内容。这使我可以重复上述情况 换言之: -用户界面似乎与实际选择的内容不同步。 -

简而言之,我的问题是WPF DataGrid不允许我选择第一行以外的任何内容。当我第一次用数据填充它时,没有选择任何行。接下来,无论单击哪一行,第一行都会亮起。当我使用OneWayToSource绑定SelectedItem属性时,我看到确实选择了正确的行。如果我选择再次单击其他行,则不会发生任何事情:UI仍停留在第一行,SelectedItem属性保留以前正确的值。此时,我必须按住ctrl键并单击第一行以取消选择内容。这使我可以重复上述情况

换言之: -用户界面似乎与实际选择的内容不同步。 -需要按住Ctrl键并单击以取消选择所选内容。 -即使SelectedItem属性指示选择了其他行,也必须在第一行上执行Ctrl-click

我理解这是一种奇怪的行为。我试图在一个单独的项目中复制它,但没有成功。因此,我只是把它扔出去看看有没有人知道它为什么会这样做

在我的单独项目中,我唯一没有重复的是在视图/视图模型连接中使用MEF。其他一切都一样


编辑:我刚刚用一个列表框替换了前面提到的DataGrid,我遇到了同样的问题。我正在使用Snoop来尝试找出应用于控件的哪些内容会极大地改变其行为。

我的问题是,我添加到DataGrid和ListBox中的对象覆盖了Equals()和GetHashCode()函数。这两个控件呈现所选项目的方式都被搞砸了,因此解释了SelectedItem问题。最后,通过简单地删除/修复这些覆盖,所有问题都得到了解决


因为这显然取决于您的特定代码,所以如果您能够提供所述代码,这将非常有用。我认为,只有当您的实现确定该类型的所有对象都相等时,这才会导致问题。否则,如果您正在生成良好的散列并正确比较对象,那么这真的不会产生问题。该类已由同事修改以反映某些业务规则。Equals()使用一个成员枚举变量来比较所讨论的类,GetHashCode()还依赖于同一成员枚举变量上的GetHashCode方法。显然,通过将业务规则移到其他位置并删除覆盖的Equals()和GetHashCode()解决了这个问题。虽然我确实认为模型中存在该约束是有正当理由的(代码似乎是正确的),但这似乎是我问题的根源。我的一个数据网格也有同样的问题,如上所述,我把绑定到网格的对象的Equals()实现搞砸了。问题现在解决了。这不是一个明显的问题,并导致了一些严重的头部抓伤。