Как установить тип нового элемента, который будет вставлен в DataGrid?

#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));
        });