2012-01-27 88 views
1

我使用EF和WPF創建應用程序,顯示客戶數據並允許我編輯此數據。 Datagrid向我顯示客戶的電話號碼。ListCollectionView和DataGrid添加行

昨天我已經把CollectionView從CollectionViewSource更改爲ListCollectionView,因爲我想過濾它們並進行排序。

((ISupportInitialize)mycollection).BeginInit(); 
    mycollection.CollectionViewType = typeof(ListCollectionView); 
    ((ISupportInitialize)mycollection).EndInit(); 

但是今天我意識到,如果客戶沒有至少一個電話號碼,那麼沒有額外的行添加新對象。下面是一些屏幕更好的觀點:

when tel exists

when tel doesn't exists

在這兩種情況下IsEnable和IsReadOnly不會改變。有任何想法嗎?

回答

2

當集合爲空時,ListCollectionView不知道它需要添加什麼類型的對象。有通過反射來設置類型的解決方案:

public static void SetTypeToListCollectionView(Type t, CollectionViewSource collectionViewSource) 
{ 
    ListCollectionView repositoryView = (ListCollectionView)collectionViewSource.View; 

    if (!repositoryView.CanAddNew) 
    { 
     ConstructorInfo ci = t.GetConstructor(new Type[] { }); 
     FieldInfo field = repositoryView.GetType().GetField("_itemConstructor", BindingFlags.Instance | BindingFlags.NonPublic); 
     field.SetValue(repositoryView, ci); 
    } 
} 

它的工作,但你需要結合CollectionViewSource到DataGrid.ItemsSource

我已經做了這樣的事情,設置類型之後才做到這一點:

BindingOperations.ClearAllBindings(dataGrid); 
BindingOperations.SetBinding(dataGrid, DataGrid.ItemsSourceProperty, new Binding() { Source = collectionViewSource }); 
+0

工程很好。另一件好事(反思)。非常感謝! – devarc 2012-01-30 08:36:59