【问题标题】:Datagrid Binding to ObservableCollection WPFDatagrid 绑定到 ObservableCollection WPF
【发布时间】:2013-10-14 10:26:39
【问题描述】:

我将 Datagrid 绑定到 ObservableCollection 作为源,数据网格单元格允许用户更改值,当我更改单元格值时 ObservableCollection 不会更新的问题

这是我的 Datagrid 代码:

<DataGrid.Columns>
    <DataGridTextColumn Header="Item" Binding="{Binding Item.ItemName,Mode=TwoWay}" Width="100" IsReadOnly="False" />
    <DataGridTextColumn Header="Price" Binding="{Binding SalePrice,Mode=TwoWay}" Width="100" IsReadOnly="False"  />
    <DataGridTextColumn Header="Qtn" Binding="{Binding Quantity,Mode=TwoWay}" Width="100" IsReadOnly="False"  />
    <DataGridTextColumn Header="Totla" Binding="{Binding Total,Mode=TwoWay}" Width="100" IsReadOnly="False"  />
</DataGrid.Columns>

任何建议

【问题讨论】:

  • 不清楚你在问什么。你的问题是什么? - 发布相关数据项类。
  • 我认为这不会起作用,除非您连接 CellUpdateChanged 事件来更新该选定项。
  • @leolorenzoluis 当然这是完全不真实和错误的。 WPF 默认支持双向数据绑定,无需任何类型的代码。
  • 这不是真的,默认情况下不会设置双向绑定,具体取决于控件。 :P
  • @HighCore,它本身并不是一个绑定的东西。 WPF DataGrid 使用事务范围来更改可编辑的行。这意味着取消/提交已被烘焙。请阅读副本...

标签: c# wpf data-binding datagrid inotifypropertychanged


【解决方案1】:

当编辑其单元格时,WPF DataGrid 使用事务范围。这意味着在更改单元格后,需要“提交”以保持更改。要强制提交,您可以使用 Tab 键或 Enter 键。

很多人会在一个单元格中键入一个新值,然后将鼠标移到另一个单元格或另一个控件中。发生这种情况时,DataGrid 对事务执行“取消”,因此更改不会保留在基础集合中。事实上,除了 Tab 或 Enter(或失去焦点)之外,几乎所有其他操作都会取消交易。

如果您想捕获更改而不管用户按下什么键,那么底层类应该实现 IEditableObject。这允许视图模型强制提交并保留更改的单元格。

这是 WPF DataGrids 上的一个已知“问题”。这里有一个清晰的讨论http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx

这里讨论了关于同一主题的更微妙的“陷阱”http://blogs.msdn.com/b/vinsibal/archive/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid.aspx

Why isn't a property in my ViewModel updated when DataGrid changes? 可能重复

【讨论】:

  • 感谢 Garry 的解释
  • Garry,我想问你,假设我们有 4 个单元格的行。当我编辑对第四个单元格进行更改的第一个单元格时。当我在第一个单元格中进行更改并在数据网格的 SelectionChanged 事件中提交“按 Enter 键”时,我在 ObservableCollection 上进行了更改,ObservableCollection 中的字段发生了变化,但在数据网格“第四单元格”中仍然保持旧值虽然单元格绑定是两种方式。我希望你明白这一点。
  • 对于该行为,您必须填充 INPC 处理程序中的第 4 个单元格
【解决方案2】:

对您的属性(SalesPrice、Quantity、Total)的 Set 方法实施 RaisePropertyChanged

ObservableCollection 仅通知集合更改事件,例如从集合中添加、删除项目,ObservableCollection 的基础类属性应单独实现 RaisePropertyChanged 事件以检测其中的更改

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2015-04-02
    • 2014-08-23
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2017-02-08
    • 2016-09-13
    相关资源
    最近更新 更多