#wpf #datagrid
#wpf #datagrid
Вопрос:
Вот что я пытался сделать.. Я хочу обеспечить редактирование продуктов на месте в datagrid. Сначала я завернул в ObservableCollection a List<Product>
и реализовал интерфейс INotifyPropertyChanged для каждого POCO. Отмена изменений и отслеживание того, что изменилось, для фиксации кажется сложным, и у меня было много проблем.. Также я чувствую, что создавать так много обработчиков событий для каждого отдельного poco при изменении свойства не очень странно…
Итак, я спрашиваю, решает ли DataTable эти проблемы? Даже это решает, как насчет проверки?Он ничего не знает о POCO…. Есть ли другие лучшие решения для этого??
Комментарии:
1. Вы работаете с
ObservableCollection<List<Product>>
orObservableCollection<Product>
?2. первый, в список источников
Ответ №1:
Обработчики изменения свойств не так уж и плохи. Вот пример:
// Hook up a CollectionChanged event
ProductCollection.CollectionChanged = ProductCollection_Changed;
// In the Collection Changed event, hook up a PropertyChanged event
void ProductCollection_Changed(object sender, CollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach(Product item in e.NewItems)
item.PropertyChanged = Product.PropertyChanged;
}
if (e.OldItems != null)
{
foreach(Product item in e.OldItems)
item.PropertyChanged -= Product.PropertyChanged;
}
}
// In the Product property changed event, do something.
// Usually I only use this for raising the CollectionChanged event when
// a property of an object inside a collection changes.
void Product_Changed(object sender, PropertyChangedEventArgs e)
{
}
Лично я бы предпочел, чтобы каждый Product
отслеживал свои собственные изменения, а не отслеживал их в ViewModel. При первом создании продукта сохраните копию исходных данных и предоставьте что-то вроде UndoChanges()
метода, который просто перезагружает исходные данные.
Чтобы отслеживать изменения в отдельных свойствах, я бы сделал это в set
методе каждого Product
свойства. Это связано с тем, что PropertyChanged
событие может быть вызвано вручную и не обязательно означает, что свойство изменилось.
private int _someValue;
public int SomeValue
{
get { return _someValue; }
set
{
if (value != _someValue)
{
// Track what's changed here.
// How you do it is based on what you want to track
if (!ChangedProperties.Keys.Contains("SomeValue"))
{
ChangedProperties.Add(
new KeyValuePair<string, object>("SomeValue", _someValue));
}
_someValue = value;
RaisePropertyChanged("SomeValue");
}
}
}
Комментарии:
1. ну, в вашем первом примере, который будет работать только для новых элементов. Как насчет существующих продуктов? Должен ли я повторять каждый продукт в начале?
2. @Parhs При условии, что вы подключаете
CollectionChanged
событие до заполненияObservableCollection
, первый пример будет выполняться и для ваших начальных элементов. Если нет, вам придется вручную перебирать элементы после начальной загрузки и подключать ихPropertyChanged
события таким же образом.
Ответ №2:
DataTable решает несколько вещей…
- Когда вы не уверены, сколько столбцов у вас будет.
- При частых изменениях изменения вносятся в таблицу данных, и если таблица данных имеет ограничения, они выдают ошибку из-за недопустимых записей. Таким образом, поддерживается некоторый уровень проверки и целостности данных.
- Будучи доступными для запросов, таблицы данных выдают более быстрые результаты при сортировке и фильтрации с помощью их DefaultView, т.Е.
DataView
.
Сказав это…
- Частые обновления лучше достигаются за счет наблюдаемой коллекции с внедрением каждого элемента
INotifypropertyChanged
. - Использование проверок
Bindings
легко достижимо. - Datagrid предоставляет больше возможностей для объектной модели коллекций, чем таблицы данных.
Так что, в конечном счете, это ваш выбор. Однако я не возражаю против наблюдаемых коллекций и уведомлений INotifyPropertyChanged, поскольку они, похоже, извлекают максимум пользы из WPF DataGrid … с точки зрения стиля и производительности.
Комментарии:
1. Я хочу добиться массового редактирования. Однако, используя уведомления, я должен отслеживать, какие строки изменились, поэтому другого решения для этого нет? С datatable Сложнее выполнять проверки и т. Д.?
2. Это то, что я сказал, я все еще думаю
ObservableCollection
, иINotifyPropertyChanged
это хорошо. Они предложат вам частые изменения и проверки на основе привязки.3. я не знаю, почему я не могу найти какой-либо образец в Интернете, кроме конкретного datatable. Знать, какие строки изменились, кажется нормальным и простым, но кажется слишком сложным не создавать запрос на обновление для полного poco.