2011-10-23 28 views
1

我已經將DataGrid的ItemsSource綁定到了ObservableCollection<T>,現在的問題是T是一個抽象類,並且集合只能包含T派生類型。如何設置將在DataGrid中插入的NewItem類型?

我正在看DataGrid的InitializingNewItem事件,但這隻允許我設置屬性,而不是我自己創建一個項目,並將其添加到數據網格或將其設置爲新項目的佔位符在底部。

回答

1

不幸的是,如果在T中不存在默認的構造函數,那麼很難啓用新的行功能。

你將不得不自己管理這個。根據需要Add,可將新項目派生類型T添加到可觀察集合中。不要讓任何新的Add發生,除非這個元素被適當地填充和提交。

+0

對於這個用戶將不得不點擊一個按鈕,但我希​​望用戶只需在最後一個新的空行中輸入值,我希望用戶使用內置添加新行功能。 –

+0

如果您從DataGridRow處理'LostFocus',並且檢查焦點丟失行是否對應於空項目並因此提交\驗證並拒絕對該行執行的更改,那麼這是否可能? –

+0

我不知道這些事件,這就是爲什麼我問這個問題。我得到InitializingNewItem,但數據網格內部使用的AddNewItem方法是私有的。如果我只能更改屬性,但不能更改或分配自己的新項目。我知道使用ListViewCollection的數據網格,我可以創建自己的ListViewCollection,但即使這樣也沒有任何可以覆蓋的屬性或方法。 –

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)); 
     }); 
+0

不起作用爲抽象類。我必須在事件中輸入。 –

相關問題