ObservableCollection在完成时触发事件

本文关键字:事件 完成时 ObservableCollection | 更新日期: 2023-09-27 18:04:40

我在MVVM架构中构建WPF项目。我的ViewModel类包含SentenceVM类的ObservableCollection,这也是一个ViewModel类(实现INotifyPropertyChanged)。

ObservableCollection绑定到DataGrid,我想允许通过DataGrid内置功能向集合添加新记录。

ObservableCollection<SentenceVM> observe = new ObservableCollection<SentenceVM>()

问题是CollectionChanged事件在添加行过程开始时触发。因此,我不知道什么时候参考数据库提交新的数据。

我需要在用户完成添加新数据时触发此事件,而不是在开始时触发。

我知道它可以通过生成一个在END插入或Enter键上执行的命令来完成,但我正在寻找一种实用的方法来实现这个ObservableCollection

ObservableCollection在完成时触发事件

我发现没有办法通过ObservableCollection做到这一点。在实际操作中,唯一的方法是定义一个'EventToCommand'触发器,它在CellEditEnding事件上执行并执行有界命令,就像这样:

1)定义从TriggerAction类继承的触发器类,并定义调用方法:

public class EventToCommandTrigger : TriggerAction<FrameworkElement>
2)定义要绑定到的ICommand(依赖属性):
public ICommand CommandToExecute
{
    get { return (ICommand)GetValue(CommandToExecuteProperty); }
    set { SetValue(CommandToExecuteProperty, value); }
}
public static readonly DependencyProperty CommandToExecuteProperty =
        DependencyProperty.Register("CommandToExecute", typeof(ICommand), typeof(EventToCommandTrigger), new FrameworkPropertyMetadata(null));

3)像这样实现抽象的Invoke方法:

protected override void Invoke(object parameter)
{
    if (CommandToExecute == null)
        return;
    if (CommandToExecute.CanExecute(parameter))
        CommandToExecute.Execute(parameter);
}

4)然后在xaml代码中,将CellEditEnding事件连接到上述触发器,如下所示:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="CellEditEnding">
        <triggers:EventToCommandTrigger CommandToExecute="{Binding Path=DeleteCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

问题是CollectionChanged事件在添加行过程开始时触发。因此,我不知道什么时候参考数据库提交新的数据。

在我看来,在CollectionChanged事件中插入数据到数据库中没有什么错。事实上,NotifyCollectionChangedEventArgs为您提供了执行此操作所需的一切。

考虑查看e.NewItemse.OldItemsNewItems是插入到集合中的数据,您可以简单地遍历该列表并相应地执行操作。