#wpf #datagrid #observablecollection
#wpf #datagrid #observablecollection
Вопрос:
Я привязал ItemsSource DataGrid к an ObservableCollection<T>
, теперь проблема в том, что T
это абстрактный класс, и коллекция может содержать только T производных типов. только.
Я наблюдаю за событием InitializingNewItem DataGrid, но это позволяет мне только устанавливать свойства, вместо этого я хотел бы сам создать элемент и добавить его в datagrid или установить его в качестве нового элемента в нижней части.
Ответ №1:
К сожалению, если конструктор по умолчанию не существует, T
тогда трудно включить функциональность новой строки.
Вам придется управлять этим самостоятельно. По требованию Add
в наблюдаемую коллекцию может быть добавлен новый элемент производного типа T. Не допускайте появления новых Add
элементов, если этот элемент не заполнен и не зафиксирован надлежащим образом.
Ответ №2:
Это хак, но иногда использование отражения является самым простым.
// hook on ItemsSource property change
DependencyPropertyDescriptor.FromProperty(
ItemsControl.ItemsSourceProperty,
typeof(ItemsControl)).AddValueChanged(dataGrid,
delegate
{
if (null == dataGrid.ItemsSource)
return;
var view = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);
// and specify your type of constructor
var constructorField = view.GetType().GetField("_itemConstructor", BindingFlags.NonPublic | BindingFlags.Instance);
constructorField.SetValue(view, typeof(MyItemType).GetConstructor(Type.EmptyTypes));
});