我在MVVM架构中构建WPF项目。
我的ViewModel类包含ObservableCollection
SentenceVM
类,它也是一个ViewModel类(实现INotifyPropertyChanged
)。
这个ObservableCollection
绑定到DataGrid,我想允许通过DataGrid构建函数在集合中添加新记录。
ObservableCollection<SentenceVM> observe = new ObservableCollection<SentenceVM>()
问题是CollectionChanged
事件在添加行过程开始时触发。因此,我不知道何时引用数据库来提交新数据。
当用户完成添加新数据时,我需要触发此事件,而不是在开始时。
我知道可以通过生成一个在END插入或Enter键上执行的命令来完成,但我正在寻找一种实用的方法来实现这个ObservableCollection
。
谢谢!
答案 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.NewItems
和e.OldItems
。 NewItems
是要插入到集合中的数据,您可以简单地遍历此列表并相应地执行操作。