2012-01-27 2 views
1

Я использую EF и WPF для создания приложения, которое показывает мне данные клиента и позволяет мне редактировать эти данные. Datagrid показывает мне номера телефонов на клиенте.ListCollectionView & DataGrid add row

Вчера я сменил свои коллекции с 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