Отмена удаления DataGrid - PullRequest
0 голосов
/ 07 мая 2018

У меня есть два экземпляра CollectionViewSource:

<FrameworkElement.Resources>
    <CollectionViewSource x:Key="currentImages" Source="{Binding ImageFiles}" />
    <CollectionViewSource x:Key="toDeleteImages" Source="{Binding ImageFiles}" />
</FrameworkElement.Resources>

Оба связаны с одним и тем же ObservableCollection<ImageFileDetails> (в свойстве ImageFiles модели представления):

// implements INPC via Fody.PropertyChanged
[AddINotifyPropertyChangedInterface]
public class ImageFileDetails {
    public string Path { get; set; }
    public bool ToDelete { get; set; }
}

Разница между двумя коллекциями CollectionViewSources заключается в фильтрах:

(Resources("currentImages") as CollectionViewSource).Filter += (s,e) =>
    e.Accepted = !e.Item<ImageFileDetails>().ToDelete;
(Resources("toDeleteImages") as CollectionViewSource).Filter += (s, e) =>
    e.Accepted = e.Item<ImageFileDetails>().ToDelete;

Теперь у меня есть две DataGrids, каждая из которых связана с одним из CollectionViewSources. Я хочу иметь возможность нажать клавишу DELETE на одной из сеток данных и переместить элемент в другую. Элемент на самом деле не должен быть удален из коллекции, а свойство ToDelete должно быть переключено - с true до false и с false до true.

Я попытался обработать событие CollectionChanged на ObservableCollection и повторно добавить элемент, который был удален из коллекции:

vm.ImageFiles.CollectionChanged += (s, e) => {
    if (e.Action != Remove) { return; }
    foreach (ImageFileDetails x in e.OldItems) {
        x.ToDelete = !x.ToDelete;
        vm.Imagefiles.Add(x);
    }
};

но это не с:

System.InvalidOperationException: 'Невозможно изменить ObservableCollection во время события CollectionChanged.'

Как я могу отменить удаление предмета из коллекции?

1 Ответ

0 голосов
/ 07 мая 2018

Я использовал событие PreviewKeyDown; выделение перемещается к следующему элементу после обновления CollectionViewSource:

KeyEventHandler deleteHandler = (s, e) => {
    if (e.Key != Delete) { return; }
    if (Modifiers.HasFlag(Alt) || Modifiers.HasFlag(ModifierKeys.Control) || Modifiers.HasFlag(Shift)) { return; }
    e.Handled = true;

    var dg = s as DataGrid;
    var ifd = dg.SelectedItem as ImageFileDetails;
    ifd.ToDelete = !ifd.ToDelete;

    //even though INPC is implemented on ImageFileDetails, the changes aren't noticed by the
    //CollectionViewSource
    cvsCurrentImages.View.Refresh();
    cvsToDeleteImages.View.Refresh();

    dg.Focus();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...