2015-07-26 4 views
0

Я работаю над проектом проекта WPF в архитектуре MVVM. Класс My ViewModel содержит ObservableCollection класса SentenceVM, который также является классом ViewModel (реализует INotifyPropertyChanged).ObservableCollection Пожары Событие On Завершено

Этот ObservableCollection связан с DataGrid, и я хотел бы разрешить добавлять новые записи в коллекцию с помощью функции сборки DataGrid.

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

Проблема заключается в том, что CollectionChanged срабатывает событие в начале процедуры добавления строки. Таким образом, я не знаю, когда обращаться к базе данных для отправки новых данных.

Мне нужно, чтобы это событие было запущено, когда пользователь закончил добавлять новые данные, а не в начале.

Я знаю, что это можно сделать, создав команду, которая выполняется при вставке END или клавише Enter, но я ищу практический способ сделать это с помощью этого ObservableCollection.

Спасибо!

+1

событие collectionchanged будет срабатывать, когда новый элемент добавляется в коллекцию (или удаляется), поэтому вы получаете событие в начале. что определяет, когда пользователь закончил добавлять данные? –

+0

Да, я знаю это, но я ищу способ получить уведомление (в классе VM), когда пользователь закончил добавлять данные. – Jacob

+1

вправо, но пользователь может добавлять данные в любое время.какой тип механизма вы бы использовали, чтобы определить, что пользователь закончил? например, вам понадобится нечто вроде «таймера», которое будет запускать событие «добавление завершенного», если после 5 секунд не будет добавлено никаких данных. –

ответ

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

yup, это тоже хороший подход. изначально я не был уверен, как данные добавляются, но «celledit» работает отлично. –

0

Проблема состоит в том, что срабатывает событие CollectionChanged в начале добавления строки процедура. Таким образом, я не знаю, когда обращаться к базе данных для отправки новых данных.

На мой взгляд, нет ничего плохого в том, чтобы вставлять данные в базу данных внутри события CollectionChanged. Фактически, NotifyCollectionChangedEventArgs дает вам все необходимое для выполнения этого действия.

Рассмотрите возможность рассмотрения e.NewItems и e.OldItems. NewItems - это данные, которые вставляются в коллекцию, вы можете просто перебирать этот список и действовать соответствующим образом.

Смежные вопросы