ObservableCollection在完成时触发事件

时间:2015-07-26 18:37:11

标签: c# wpf silverlight mvvm datagrid

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

这个ObservableCollection绑定到DataGrid,我想允许通过DataGrid构建函数在集合中添加新记录。

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

问题是CollectionChanged事件在添加行过程开始时触发。因此,我不知道何时引用数据库来提交新数据。

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

我发现没有办法通过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>

答案 1 :(得分:0)

  

问题是CollectionChanged事件在添加行过程开始时触发。因此,我不知道何时引用数据库来提交新数据。

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

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