如何设置将插入DataGrid的NewItem类型?

时间:2011-10-23 13:01:36

标签: wpf datagrid observablecollection

我已将DataGrid的ItemsSource绑定到ObservableCollection<T>,现在的问题是T是一个抽象类,而集合只能包含T派生类型。

我正在观看DataGrid的InitializingNewItem事件,但这只允许我设置属性,而是我想自己创建一个Item并将其添加到datagrid或将其设置为底部的New Item占位符。

2 个答案:

答案 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));
        });