我有一个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”事件来跟踪用户何时完成输入。这之后是一个InvokeCommandAction,它调用在MainViewModel中定义的命令。该命令仅指向一种方法,该方法仅设置了第一个DataTable的所有更改的DataTable
public void SetEdited()
{
DataTable planningViewChanges = _planningView.GetChanges();
}
结果:
当我在方法中放置一个断点时,我看到在单击已编辑的单元格之后单击该断点。但是我认为,当我的断点停止时,该单元并没有完全结束结尾。
当我查看方法并检查DataTable对象“ planningViewChanges”时,它为null。当我继续该应用程序并且该编辑在视觉上结束于该单元格时,我尝试更改另一个单元格,或者通过按钮调用我的Command,然后再次检查DataTable“ planningViewChanges”是否具有一行。因此很明显,将DataGrid中的数据提交到源DataTable的工作正常,但是在“ CellEditEnding”或“ RowEditEnding”事件之后并不能立即执行...
我的第二种方法
我搜索并浏览了许多其他可能与此问题类似的问题。一种方法是甚至在DataGrid上也使用“ LostFocus”,但是提交后也没有触发。当我尝试将UpdateSourceTrigger选项更改为“ LostFocus”或“ PropertyChanged”时,提交未在事件发生之前开始...
此外
我读过的另一种方法是使用自定义类的列表。但这不适合我的问题,因为DataGrid列的数目可以动态变化。
我的问题
没有任何人知道如何获取这是一个编辑单元格后触发的事件,并在提交之后?还是有一种更适合MVVM模式的解决方案?关于类似问题的许多答案实际上并没有太多共通之处,每个人对于MVVM是什么样,不是都有自己的看法。
我发现了另一个在提交后立即触发的事件。事件“ CurrentCellChanged”有效,但必须谨慎对待。每当您更改当前选定的单元格(如您在名称上看到)时,它就会触发,即使您开始编辑该单元格也是如此。我在被调用的方法中进行了一些更改,因此不会每次都触发整个逻辑,但是仅当我想跟踪更改的单元格(行)时才执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句