0

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

这是我的数据网格代码:

<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>

有什么建议么

4

2 回答 2

3

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

为什么 DataGrid 更改时我的 ViewModel 中的属性没有更新

于 2013-10-07T18:56:12.490 回答
0

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

ObservableCollection 仅通知集合更改事件,例如从集合中添加、删除项目,ObservableCollection 的底层类属性应单独实现 RaisePropertyChanged 事件以检测它们的变化

于 2013-10-07T18:22:43.573 回答