我将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>
任何建议
答案 0 :(得分: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
Why isn't a property in my ViewModel updated when DataGrid changes?
可能重复答案 1 :(得分:0)
将 RaisePropertyChanged 实施到您的属性(SalesPrice,Quantity,Total)的Set方法
ObservableCollection仅通知集合更改事件,如添加,从集合中删除项目,ObservableCollection的基础类属性应该单独实现RaisePropertyChanged事件以检测其中的更改