У меня есть DataGrid
в приложении WPF, которое имеет для ItemsSource
пользовательскую коллекцию, которую я написал.Коллекция обеспечивает, чтобы все ее элементы удовлетворяли определенному требованию (а именно, они должны быть между некоторыми минимальными и максимальными значениями).
Подпись класса коллекции:
public class CheckedObservableCollection<T> : IList<T>, ICollection<T>, IList, ICollection,
INotifyCollectionChanged
where T : IComparable<T>, IEditableObject, ICloneable, INotifyPropertyChanged
Я хочу иметь возможностьиспользовать функцию DataGrid
, в которой при редактировании последней строки в DataGrid
новый элемент добавляется в конец ItemsSource
.
К сожалению, DataGrid
просто добавляет новый элемент, созданный с использованием конструктора по умолчанию.Таким образом, при добавлении нового элемента, DataGrid
косвенно (через его ItemCollection
, который является запечатанным классом) объявляет:
ItemsSource.Add(new T())
, где T - тип элементов в CheckedObservableCollection.Я хотел бы, чтобы сетка вместо этого добавила другой T, который удовлетворяет ограничениям, наложенным на коллекцию.
Мои вопросы: есть ли способ сделать это?Кто-нибудь уже сделал это?Каков наилучший (самый простой, самый быстрый для кода; производительность не проблема) способ сделать это?
В настоящее время я только что получил DataGrid
, чтобы переопределить функцию OnExecutedBeginEdit
своей собственной следующим образом:
public class CheckedDataGrid<T> : DataGrid where T : IEditableObject, IComparable<T>, INotifyPropertyChanged, ICloneable
{
public CheckedDataGrid() : base() { }
private IEditableCollectionView EditableItems {
get { return (IEditableCollectionView)Items; }
}
protected override void OnExecutedBeginEdit(ExecutedRoutedEventArgs e) {
try {
base.OnExecutedBeginEdit(e);
} catch (ArgumentException) {
var source = ItemsSource as CheckedObservableCollection<T>;
source.Add((T)source.MinValue.Clone());
this.Focus();
}
}
}
Где MinValue
- наименьший допустимый элемент в коллекции.
Мне не нравится это решение.Если у кого-нибудь из вас есть совет, я буду очень признателен!
Спасибо