Здравствуйте. Я новичок в 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.