2015-03-10 3 views
2

У меня есть ObservableCollection и я прилагаю к событию CollectionChanged:WPF CollectionChanged Event OldItems.Count

void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.Action == NotifyCollectionChangedAction.Add) 
    { 
     for (int i = 0; i < e.NewItems.Count; i++) 
     { 
      int id = -1 * i; 
      DocumentWatchList d = (DocumentWatchList)e.NewItems[i]; 
      d.UID = id; 
      _dataDc.DocumentWatchLists.InsertOnSubmit(d); 
     } 
    } 
    else if (e.Action == NotifyCollectionChangedAction.Remove) 
    { 
     for (int i = 0; i < e.OldItems.Count; i++) 
     { 
      DocumentWatchList d = (DocumentWatchList)e.OldItems[i]; 
      _dataDc.DocumentWatchLists.DeleteOnSubmit(d); 
     } 
    } 
    _dataDc.SubmitChanges(); 
} 

Моя коллекция привязывается к сетке, а код ViewModel (выше) вызывается, как и ожидалось. Когда я выбираю несколько строк и удаляю delete, я ожидаю, что коллекция OldItems будет содержать количество строк, которые я выбрал (n). однако на самом деле происходит то, что событие получает n раз, и каждый раз, когда количество коллекции OldItems равно 1. Итак, при каких условиях коллекция OldItems содержит более 1 элемента? Это поведение происходит из элемента управления datagrid, или, вернее, это способ, которым должен работать ObservableCollection.CollectionChanged?

ответ

0

По какой-то причине ObservableCollection не поддерживает событие NotifyCollectionChanged с несколькими элементами.

Вы можете сделать это:

OnCollectionChanged(
    new NotifyCollectionChangedEventArgs(
     NotifyCollectionChangedAction.Remove, singleItem)); 

Но не это: (вы получите NotSupportedException)

OnCollectionChanged(
    new NotifyCollectionChangedEventArgs(
     NotifyCollectionChangedAction.Remove, multipleItems)); 

Я не могу думать ни о каком сценарии, где e.OldItems.Count бы быть больше 0.

Here - хорошая статья об этом, где кто-то фактически реализовал обработку нескольких предметов самостоятельно, для служебных целей.

0

Если вы посмотрите на интерфейс, который наблюдаемым коллекция предлагает вам, вы уже знаете, что вы получите:

https://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx

В основном это не дает какой-либо способ, чтобы вставить или удалить несколько элементов на один раз. Таким образом, это эффективно означает, что вы можете очистить всю коллекцию, но если вам нужно сказать, что удалите 2 элемента, а в коллекции их 6, вам придется их удалить один за другим. Это то, что будет делать datagrid в вашем случае, но предположим, что вы должны реализовать свой собственный datagrid, вы были бы вынуждены делать это одинаково.

Чтобы сделать ответ полным, я должен добавить, что есть способ получить несколько элементов в удаленном списке, но только путем очистки коллекции.

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

Вы можете, конечно, создать собственную реализацию наблюдаемой коллекции, которая бы решила эти проблемы. Но я думаю, что вам понадобится другая реализация datagrid, которая будет использовать ваши собственные новые операции массовой вставки или массового удаления.