Удаление элемента из DataContext и отображение обновленных значений БЕЗ SaveChanges () - PullRequest
0 голосов
/ 24 октября 2018

В моей WPF форме есть DataGrid, в котором отображаются элементы из DataContext через Binding .Я добавил столбец с кнопками удаления, которые связаны с командой в ViewModel , которая должна удалить элемент из контекста, и соответственно обновил DataGrid.

XAML

<DataGrid ItemsSource ="{Binding Quiz.Questionnaire}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Vraag" Binding="{Binding Content, Mode=TwoWay}"></DataGridTextColumn>
            <DataGridTextColumn Header="Aantal antwoorden" Binding="{Binding AnswerCount, Mode=OneWay}" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Delete" Command="{Binding Path=DataContext.DeleteRow, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"
                                CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

ViewModel

public void DeleteRowCommand(object row)
    {
        if(row is QuestionVM question)
        {
            _Context.Questions.Remove(question.ToModel);
            RaisePropertyChanged(nameof(Quiz.Questionnaire));
        }
        else if(row is AnswerVM answer)
        {
            _Context.Answers.Remove(answer.ToModel);
            RaisePropertyChanged(nameof(Answers));
        }
    }
  • Я подтвердил, что код правильно вызывает метод, поэтому это не проблемас Переплет .
  • Я подтвердил, что база данных корректно обновляется, когда я нажимаю кнопку, содержащую DataContext.SaveChanges().

Однако мне нужно, чтобы DataGridудаляет элемент из списка до Я сохраняю изменения.Так что я могу отменить изменения, если захочу.

Обновление

В основном я пытаюсь создать окно Edit , в которомЯ могу отредактировать элемент по своему усмотрению, а затем либо подтвердить свои изменения, либо передумать и вернуться к предыдущему виду и отменить все сделанные мной изменения.

Для этого у меня есть Edit окна ViewModel моего окна, создающего свой собственный экземпляр DataContext.Если я нажимаю кнопку Сохранить изменения , этот контекст отправляется обратно в предыдущее окно, и база данных обновляется соответствующим образом, но если я нажимаю Отменить изменения , я просто закрываю окно и продолжаюсо старым, неотредактированным контекстом.

Для ясности, сейчас я просто хочу, чтобы кнопка «Удалить», упомянутая в OP, немедленно удалила (визуально) свою строку из списка DataGrid

.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Создайте контейнеры для вопросов и ответов как ObservableCollections.Элементы управления пользовательского интерфейса будут автоматически обновляться при добавлении или удалении элемента.В этом случае нет необходимости в вызовах RaisePropertyChanged ().

0 голосов
/ 24 октября 2018

Я бы добавил свойство к вашему классу элементов.

bool PendingDelete {get; set;} = false;

Затем используйте CollectionViewFilter, чтобы отфильтровать все элементы, помеченные для удаления.Нажатие кнопки удаления помечает элемент для удаления, а также обновляет CollectionView.

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

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