【问题标题】:ObservableCollection Fires Event On CompletedObservableCollection 在完成时触发事件
【发布时间】:2015-10-16 21:33:02
【问题描述】:

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

这个ObservableCollection 绑定到一个DataGrid,我想允许通过DataGrid 内置函数将新记录添加到集合中。

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

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

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

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

谢谢!

【问题讨论】:

  • 每当有新项目添加到集合中(或删除)时,collectionchanged 事件就会触发,这就是您在开始时收到该事件的原因。什么决定了用户何时完成添加数据?
  • 是的,我知道,但我正在寻找一种方法来在用户完成添加数据时获得通知(在 VM 类中)。
  • 对,但用户可以随时添加数据。您将使用什么类型的机制来确定用户已完成?例如,如果 5 秒后没有添加数据,您将需要类似“计时器”的东西,它会触发“添加完成”事件。
  • 是的,你是对的,谢谢!

标签: c# wpf silverlight mvvm datagrid


【解决方案1】:

我发现没有办法通过ObservableCollection 这样做。在实际中这样做的唯一方法是定义一个在CellEditEnding 事件上执行的“EventToCommand”触发器并执行有界命令,如下所示:

1) 定义继承自TriggerAction类的触发器类并定义invoke方法:

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>

【讨论】:

  • 是的,这也是一个好方法。最初,我不确定数据是如何添加的,但“celledit”工作得很好。
【解决方案2】:

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

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

考虑查看e.NewItemse.OldItemsNewItems 是被插入到集合中的数据,您可以简单地遍历这个列表并采取相应的行动。

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多