【问题标题】:How can I track changes of a DataGrid WPF MVVM如何跟踪 DataGrid WPF MVVM 的更改
【发布时间】: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。

标签: c# wpf mvvm datagrid


【解决方案1】:

我发现另一个在提交后立即触发的事件。事件“CurrentCellChanged”有效,但必须谨慎对待。每次更改当前选定的单元格时都会触发它(正如您在名称上看到的那样),因此即使您开始编辑单元格也是如此。我在调用的方法中做了一些更改,所以我的整个逻辑不会每次都触发,但只有在我想跟踪更改的单元格(行)时才会触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2021-08-31
    • 2016-01-19
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多