【问题标题】:WPF DataGrid can't change selected row: stuck on first rowWPF DataGrid 无法更改所选行:卡在第一行
【发布时间】:2011-02-08 16:26:26
【问题描述】:

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

换句话说: - UI 似乎与实际选择的内容不同步。 - 需要按住 Ctrl 键才能取消选择。 - 即使 SelectedItem 属性指示选择了不同的行,也必须在第一行上执行 Ctrl 键单击。

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

在我的单独项目中唯一没有重复的事情是使用 MEF 进行 View/ViewModel 连接。其他一切都一样。

编辑:我刚刚用 ListBox 替换了所说的 DataGrid,并且遇到了同样的问题。我正在使用 Snoop 来尝试找出可能会应用到控件上的哪些内容会极大地改变其行为。

【问题讨论】:

  • 由于这显然取决于您的特定代码,如果您能提供所述代码将会很有帮助。

标签: c# wpf datagrid .net-4.0 wpfdatagrid


【解决方案1】:

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

哇!

【讨论】:

  • 在这里发现了类似的问题:social.msdn.microsoft.com/Forums/en-US/wpf/thread/…
  • 您是如何实现 Equals() 和 GetHashCode() 的。我认为只有在您的实现确定该类型的所有对象都相等时,这才会导致问题。否则,如果您生成良好的哈希值并正确比较对象,那真的不应该提供问题。
  • 该类已被同事修改以反映某些业务规则。 Equals() 使用成员枚举变量来比较有问题的类,GetHashCode() 还依赖于同一成员枚举变量的 GetHashCode 方法。显然,通过将业务规则移到其他地方并删除覆盖的 Equals() 和 GetHashCode() 来解决问题。虽然我确实认为在模型中有这个约束是有正当理由的(而且代码看起来是正确的),但这似乎是我问题的根源。
  • 我的一个数据网格遇到了完全相同的问题,并且 - 如上所述 - 对于绑定到网格的对象,我搞砸了 Equals() 的实现。问题现已解决。这不是一个明显的问题,并导致一些严重的头部抓伤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多