@Sterk
Программист

Какова правильная логика работы DataGrid с MVVM?

Здравствуйте. Я новичок в WPF и у меня возникли проблемы использования DataGrid с использование шаблона MVVM(Catel Framework). В общем случае я хотел работать так:
В конструкторе MyViewModel через сервис получается некий набор данных, например, из БД и он присваивается к ObservableCollection. Эта коллекция в свою очередь привязывается к DataGrid'у. В MyViewModel я создаю две команды CommitItem и DeleteItem - для фиксации изменения значения элемента в БД и для удаления элемента из БД.
В конечном варианте я получил вот такой DataGrid выполняющий описанное выше.
public class DataGridEx : DataGrid
    {
        public event EventHandler<EnumerableEventArgs> CommitRow;
        public event EventHandler<EnumerableEventArgs> DeleteRow;

        protected override void OnRowEditEnding(DataGridRowEditEndingEventArgs e)
        {
            base.OnRowEditEnding(e);
            if (e.EditAction == DataGridEditAction.Commit)
            {
                if (e.Row.IsEditing)
                {
                    this.Dispatcher.BeginInvoke(new EventHandler((control, args) =>
                    {
                        if (CommitRow != null)
                            CommitRow(this, new EnumerableEventArgs(e.Row.Item));
                    }), DispatcherPriority.Background, new object[] { this, e });
                }
            }
        }
        protected override void OnExecutedDelete(System.Windows.Input.ExecutedRoutedEventArgs e)
        {
            if (DeleteRow != null)
                DeleteRow(this, new EnumerableEventArgs(SelectedItems));
            base.OnExecutedDelete(e);
        }
    }

Но в процессе написания и исследований я узнал о валидации. Проблема теперь в том что событие CommitRow вызывается в независимости от прохождения валидации.

Вопрос: Как заставить это работать с валидацией? Либо может профессионалы расскажут правильную логику работы DataGrid с MVVM. Я не понимаю как можно реализовать грамотное добавление, удаление и редактирование элементов с валидацией.
Примечания:
Я не хочу использовать Orm из-за вопросов производительности.
Смотрел в сторону IEditableObject и EndEdit, но мне не понравилась идея делать инъекцию зависимости БД в каждый элемент модели, что бы он мог сам себя обновлять. Как аукнется производительность если элементов будет миллион и более.
Я понимаю что можно организовать такое поведение с использованием ListView и дополнительного окна для конкретной модели + кнопок добавить, удалить, редактировать. Но хотелось сделать через один элемент DataGrid.
  • Вопрос задан
  • 4709 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы