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
做到这一点。在实际操作中,唯一的方法是定义一个'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.NewItems
和e.OldItems
。NewItems
是插入到集合中的数据,您可以简单地遍历该列表并相应地执行操作。