我已将DataGrid的ItemsSource绑定到ObservableCollection<T>
,现在的问题是T
是一个抽象类,而集合只能包含T派生类型。
我正在观看DataGrid的InitializingNewItem事件,但这只允许我设置属性,而是我想自己创建一个Item并将其添加到datagrid或将其设置为底部的New Item占位符。
答案 0 :(得分:1)
遗憾的是,如果T
中不存在默认构造函数,则很难启用新的行功能。
您必须自己管理。根据需求Add
,可以将一个派生类型T 的新项目添加到可观察集合中。除非正确填充和提交此元素,否则不要让任何新的Add
发生。
答案 1 :(得分:1)
它是一个黑客,但有时使用反射是最简单的。
// 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));
});