【发布时间】:2020-04-03 17:37:21
【问题描述】:
我有一个 WPF/MVVM 应用程序,我想在其中跟踪用户何时更改数据网格中的某些数据。 DataGrid 有一个 ICollectionView 作为由 DataTable 填充的源:
private ICollectionView _planningCollectionView;
public ICollectionView PlanningCollectionView
{
get => _planningCollectionView;
set
{
if (_planningCollectionView == value) return;
_planningCollectionView = value;
OnPropertyChanged();
}
}
...
//_planningView is my DataTable
public MainViewModel()
{
...
PlanningCollectionView = CollectionViewSource.GetDefaultView(_planningView);
...
}
目标是制作一个小的状态栏,用户可以在其中查看是否有未保存的更改。
最重要的是,我想验证用户是否没有放回原始数据。例如,如果一个单元格在初始 DataGrid 加载时的值为“50”,而用户将其更改为“100”,则状态应显示“未保存的更改”。当用户将其更改回“50”时,状态应返回“没有未保存的更改”。
我的方法:
我尝试使用“CellEditEnding”和“RowEditEnding”事件来跟踪用户何时完成输入。接下来是调用在我的 MainViewModel 中定义的命令的 InvokeCommandAction。该命令只是指向一个方法,该方法只设置一个包含我的第一个数据表的所有更改的数据表
public void SetEdited()
{
DataTable planningViewChanges = _planningView.GetChanges();
}
结果:
当我在我的方法中放置一个断点时,我看到它在我单击编辑的单元格之后被调用。但我认为当我的断点停止时,单元格没有完全结束结尾,这很可疑。
当我查看我的方法并检查我的 DataTable 对象“planningViewChanges”时,它为空。 当我继续应用程序并且编辑在单元格中结束时,我尝试更改另一个单元格,或者我通过一个按钮调用我的命令并再次检查 DataTable“planningViewChanges”,它只有一行。 很明显,将 DataGrid 中的数据提交到源 DataTable 是有效的,但不是在“CellEditEnding”或“RowEditEnding”事件之后......
我的第二种方法
我搜索并浏览了许多可能与此问题类似的其他问题。一种方法是在 DataGrid 上使用“LostFocus”,但这也没有在提交后触发。当我尝试将 UpdateSourceTrigger 选项更改为“LostFocus”或“PropertyChanged”时,提交也没有在事件之前开始......
另外
我读过的另一种方法是使用自定义类的列表。但这不适合我的问题,因为 DataGrid 列可以随数量动态变化。
我的问题
有人知道如何在编辑单元格和后触发事件吗?还是有更适合 MVVM 模式的解决方案? 关于类似问题的许多答案实际上并没有太多共同点,每个人对什么是 MVVM 和什么不是都有自己的看法。
【问题讨论】:
-
你可以在你的数据类中实现IEditableObject。
-
Datarowview 实现 ieditableobject。
-
@mm8 我真的没有数据类,因为我不知道我的数据网格到底是什么样子。我通过 SQL 数据适配器将数据获取到我的 DataTable 中。所以我不知道如何在任何地方实现 IEditableObject。