我已經將DataGrid的ItemsSource綁定到了ObservableCollection<T>
,現在的問題是T
是一個抽象類,並且集合只能包含T派生類型。如何設置將在DataGrid中插入的NewItem類型?
我正在看DataGrid的InitializingNewItem事件,但這隻允許我設置屬性,而不是我自己創建一個項目,並將其添加到數據網格或將其設置爲新項目的佔位符在底部。
我已經將DataGrid的ItemsSource綁定到了ObservableCollection<T>
,現在的問題是T
是一個抽象類,並且集合只能包含T派生類型。如何設置將在DataGrid中插入的NewItem類型?
我正在看DataGrid的InitializingNewItem事件,但這隻允許我設置屬性,而不是我自己創建一個項目,並將其添加到數據網格或將其設置爲新項目的佔位符在底部。
不幸的是,如果在T
中不存在默認的構造函數,那麼很難啓用新的行功能。
你將不得不自己管理這個。根據需要Add
,可將新項目派生類型T添加到可觀察集合中。不要讓任何新的Add
發生,除非這個元素被適當地填充和提交。
它的黑客,但有時使用反射是最簡單的。
// 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));
});
不起作用爲抽象類。我必須在事件中輸入。 –
對於這個用戶將不得不點擊一個按鈕,但我希望用戶只需在最後一個新的空行中輸入值,我希望用戶使用內置添加新行功能。 –
如果您從DataGridRow處理'LostFocus',並且檢查焦點丟失行是否對應於空項目並因此提交\驗證並拒絕對該行執行的更改,那麼這是否可能? –
我不知道這些事件,這就是爲什麼我問這個問題。我得到InitializingNewItem,但數據網格內部使用的AddNewItem方法是私有的。如果我只能更改屬性,但不能更改或分配自己的新項目。我知道使用ListViewCollection的數據網格,我可以創建自己的ListViewCollection,但即使這樣也沒有任何可以覆蓋的屬性或方法。 –